|
17.10.2008, 12:13 | #1 |
Участник
|
Обращение к CrmService
Стандартный код выдает ошибку
using System; using System.Data; using System.Configuration; using System.Collections; using System.IO; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Xml; using CrmSdk; using CrmSdk.Discovery; public partial class UpdateActivity : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Clear(); Response.ContentType = "text/xml"; CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = 0; token.OrganizationName = "Samarasoft"; CrmService crmService = new CrmService(); crmService.CrmAuthenticationTokenValue = token; crmService.Credentials = System.Net.CredentialCache.DefaultCredentials; AppSettingsReader appSettings = new AppSettingsReader(); crmService.Url = appSettings.GetValue("CrmSdk.CrmService", Type.GetType("System.String")).ToString(); task my_task = new task(); my_task.subject = "my_task_1"; Guid t_guid = new Guid("A64664F4-E699-DD11-B4E0-00A0C5B316E9"); Owner t_owner = new Owner(); t_owner.Value = t_guid; t_owner.type = EntityName.systemuser.ToString(); my_task.ownerid = t_owner; Guid accountId = crmService.Create(my_task); } } Ошибка идет на шаге Guid accountId = crmService.Create(my_task); такая: Exception information: Exception type: SoapException Exception message: System.Web.Services.Protocols.SoapException: Сервер не распознал значение заголовка HTTP SOAPAction: http://schemas.microsoft.com/crm/200...ervices/Create. в System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest() в System.Web.Services.Protocols.SoapServerProtocol.Initialize() в System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response) в System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) Request information: Request URL: http://crm:1001/UpdateActivity.aspx?...Mode=Completed Request path: /UpdateActivity.aspx User host address: 192.168.100.62 User: Is authenticated: False Authentication Type: Thread account name: NT AUTHORITY\NETWORK SERVICE Что то я уже всю голову сломал в чем дело - стандартная конструкция не работает Подскажите в чем может быть дело...
__________________
Сергей Осипов, MCTS:SQL Server 2005, ООО "Программные технологии", Самара |
|
17.10.2008, 12:46 | #2 |
Участник
|
В других конструкциях он такое же выдает, например
activitypointer act = (activitypointer)crmService.Retrieve(EntityName.activitypointer.ToString(), idGuid, new AllColumns()); Какой то неправильный у меня сервис получился, а в чем причина не пойму...
__________________
Сергей Осипов, MCTS:SQL Server 2005, ООО "Программные технологии", Самара |
|
17.10.2008, 14:45 | #3 |
Moderator
|
Это вы скопировали из дебаггера? Приведите пожалуйста стек трасировки из лога ошибок сервера.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.10.2008, 16:46 | #4 |
Участник
|
Вообще-то, поскольку у Вас aspx-страничка, то я бы для начала вот это прочитал:
http://msdn.microsoft.com/en-us/library/cc151050.aspx |
|
|
За это сообщение автора поблагодарили: sergeyjb (1). |
19.10.2008, 12:16 | #5 |
Участник
|
Сергеи, посмотрите http://localhost:<порт>/sdk/list.aspx. Похоже,
при создании task activityid является обязателним атрибутом. |
|
|
За это сообщение автора поблагодарили: sergeyjb (1). |
20.10.2008, 08:14 | #6 |
Участник
|
maclai:
Интересная страница, не знал о ее существовании. Действительно поле activityid отмечено как Required For Grid. Удивило то, что ownerid не помечено как обязательное, хотя на форме поле "ответственный" стоит с красной звездочкой. Гуревич Денис: Спасибо за ссылку, сейчас попробую как там пишут. Есть подозрение судя по ошибкам что с самим сервисом не порядок а не с набором отправляемых полей. Я ожидал бы другой ошибки если обязательное поле отсутствовало. Хотя попробую все варианты. Артем, это часть целого сообщения в системном журнале: "Журналы Windows - Приложение". Если есть отдельный журнал ошибок CRM сервера то подскажите где его посмотреть. А из системного полный текст ошибки (точнее предупреждения): Код: Event code: 3005 Event message: Возникло необработанное исключение. Event time: 20.10.2008 8:47:52 Event time (UTC): 20.10.2008 3:47:52 Event ID: 907e722b17074104b8b6d5540dbae94c Event sequence: 6 Event occurrence: 1 Event detail code: 0 Application information: Application domain: /LM/W3SVC/3/ROOT-1-128689480638620121 Trust level: Full Application Virtual Path: / Application Path: C:\inetpub\Infrastructure\ Machine name: SRV-CRM-01 Process information: Process ID: 1828 Process name: w3wp.exe Account name: NT AUTHORITY\NETWORK SERVICE Exception information: Exception type: SoapException Exception message: System.Web.Services.Protocols.SoapException: Сервер не распознал значение заголовка HTTP SOAPAction: http://schemas.microsoft.com/crm/200...ervices/Create. в System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest() в System.Web.Services.Protocols.SoapServerProtocol.Initialize() в System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response) в System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) Request information: Request URL: http://crm:1001/UpdateActivity.aspx?...Mode=Completed Request path: /UpdateActivity.aspx User host address: 192.168.100.62 User: Is authenticated: False Authentication Type: Thread account name: NT AUTHORITY\NETWORK SERVICE Thread information: Thread ID: 5 Thread account name: NT AUTHORITY\NETWORK SERVICE Is impersonating: False Stack trace: в System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) в System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) в CrmSdk.CrmService.Create(BusinessEntity entity) в c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\5c7d8db1\29570109\App_WebReferences.wh6ss6eb.0.cs:строка 204 в UpdateActivity.Page_Load(Object sender, EventArgs e) в c:\inetpub\Infrastructure\UpdateActivity.aspx.cs:строка 64 в System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) в System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) в System.Web.UI.Control.OnLoad(EventArgs e) в System.Web.UI.Control.LoadRecursive() в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) Custom event details:
__________________
Сергей Осипов, MCTS:SQL Server 2005, ООО "Программные технологии", Самара |
|
20.10.2008, 08:32 | #7 |
Участник
|
Добавление конструкции для activityid проблему не решило, но на будущее лишним явно не будет.
Key t_key = new Key(); t_key.Value = new Guid(); my_task.activityid = t_key; Сейчас буду с Impersonate разбираться. Не зря в логе: .............. Is authenticated: False .............. Is impersonating: False .............. Не думал сначала что обращение к сервису с ASPX страницы отличается от стандартного примера в SDK. Предполагал что они в расчете на WEB доступ пример писали.
__________________
Сергей Осипов, MCTS:SQL Server 2005, ООО "Программные технологии", Самара |
|
28.10.2008, 14:57 | #8 |
Moderator
|
Сергей, возможно более подробную информацию об ошибке вы получите из логов сервера. Вот статья о том как можно их включить: http://support.microsoft.com/kb/907490/en-us. В своё время я так и отлаживался, так как в дебагер валится лишь общая ошибка веб сервиса.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: sergeyjb (1). |
29.10.2008, 07:23 | #9 |
Участник
|
Спасибо Артем, а то с отладкой мне трудновато
__________________
Сергей Осипов, MCTS:SQL Server 2005, ООО "Программные технологии", Самара |
|
29.10.2008, 13:58 | #10 |
Moderator
|
Помогло проблему устранить?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
30.10.2008, 14:30 | #11 |
Участник
|
Я сейчас переключился на интеграцию с шарпоинтом экстренно, через пару дней к этим кнопкам вернусь - тогда и опробую.
Тут вопрос возник с плагином на удаление акаунта. На первой же строке валиться, причем такой же плагин на крейт акаунта работает. Выдает ошибку: Не удалось привести тип "Microsoft.Crm.Sdk.Moniker" объекта к типу "Microsoft.Crm.Sdk.DynamicEntity". Что эта ошибка вообще означает? И почему при крейте проблем с приведением у него нет? Выдает такое как на пре- так и пост-срабатываение. Есть какая-то особенность обращения к объекту, вызвавшему плагин на удаление? Код: using System; using System.Collections.Generic; using System.Text; using System.IO; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; using ShPAccountDeletePlugin.st2; namespace ShPAccountDeletePlugin { public class UpdateAccountOnDelete : IPlugin { public void Execute(IPluginExecutionContext context) { DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target]; .............................................. } } }
__________________
Сергей Осипов, MCTS:SQL Server 2005, ООО "Программные технологии", Самара |
|
30.10.2008, 14:50 | #12 |
Moderator
|
Видимо это и означает - типовой class cast. Properties[ParameterName.Target] имеет тип Moniker а не DynamicEntity. Почему - вопрос хороший.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
30.10.2008, 15:01 | #13 |
Moderator
|
Из опыта работы с CRM 3.0... Плагины (тогда еще колауты) событий создания и изменения тогда тоже оперировали DynamicEntity, а вот события смены состояния и удаления, по какой-то идиотской логике получали лишь id и имя сущности. Теперь и то и другое содержится в классе Moniker. Видимо вам придется вычитывать объект самостоятельно. Печально, но Microsoft последовательна в своем идиотизме.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
31.10.2008, 15:27 | #14 |
Участник
|
Повешусь скоро
Мало того что все в кучу в этой CRM - и java script, и C#, и ASP, и dll, и Web-services, так еще и через одно место Спасибо за разьяснение, буду знать где рыть... А то я с колаутами в 3.0 не работал, не знал что такой нюанс есть.
__________________
Сергей Осипов, MCTS:SQL Server 2005, ООО "Программные технологии", Самара Последний раз редактировалось sergeyjb; 31.10.2008 в 15:30. |
|
31.10.2008, 15:29 | #15 |
MCTS
|
Добро пожаловать в наш МИР !!!
__________________
|
|
05.11.2008, 13:22 | #16 |
Участник
|
Артем, имея объект типа Moniker в плагине на удаление я оптимальным путем вытаскиваю значение пользовательского атрибута в следующем коде? Ничего по незнанию лишнего не написал тут? Первый раз такую вещь програмлю. Чтоб потом по одним и тем же граблям не ходить думая что это оптимальный код.
Код: Moniker moniker = (Moniker)context.InputParameters[ParameterName.Target]; Guid accountId_read = moniker.Id; ICrmService service_read = context.CreateCrmService(true); TargetRetrieveDynamic target = new TargetRetrieveDynamic(); target.EntityId = accountId_read; target.EntityName = EntityName.account.ToString(); Microsoft.Crm.Sdk.Query.ColumnSet cols = new Microsoft.Crm.Sdk.Query.ColumnSet(new string[] { "name", "new_sharepointdocumentlibrarytitle" }); RetrieveRequest retrieve = new RetrieveRequest(); retrieve.Target = target; retrieve.ColumnSet = cols; retrieve.ReturnDynamicEntities = true; RetrieveResponse response = (RetrieveResponse)service_read.Execute(retrieve); DynamicEntity retrievedEntity = (DynamicEntity)response.BusinessEntity; string listName = retrievedEntity["new_sharepointdocumentlibrarytitle"].ToString();
__________________
Сергей Осипов, MCTS:SQL Server 2005, ООО "Программные технологии", Самара |
|
05.11.2008, 14:22 | #17 |
Moderator
|
Боюсь, Сергей, как коддер я уже выпал из обоймы, но пару советов все же дам.
Во первых, специализированные методы выполняются быстрее, чем Excecute. Обычно об этом можно не думать, но в случае плагина стоит заняться оптимизацией. Иными словами я использовал бы метод Retrieve вместо Excecute. Во вторых, данная функциональность, думаю, потребуется вам не один раз, так что имеет смысл вынести этот код в родительский класс. Иными словами сделать некий ANormalParameterPlugin : IPlugin, который бы корректно поддерживал интерфейс, но умел полиморфно вычитывать DE на основании Moniker.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: sergeyjb (1). |
|
Похожие темы | ||||
Тема | Ответов | |||
Быстродействие CrmService | 16 | |||
Обращение к полю сущности | 28 | |||
аутентификация crmService | 2 | |||
Обращение! - Ответственный контакт? | 1 | |||
Обращение: невозможно добавить Контракт | 2 |
|