NetDispatcherFaultException при вызове RetrieveOrganizationInfoRequest - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь вызвать RetrieveOrganizationInfoRequest . Проблема в том, что я не могу найти его в последнем SDK (Install-Package Microsoft.CrmSdk.CoreAssemblies -Version 9.0.2.5) - он существовал в 9.0.2.4 SDK и все еще поддерживается CRM.

Существует известный способ обойти это (я имею в виду, кроме понижения SDK) - выполнить запрос явно. И.Е .:

using (var serviceProxy = new OrganizationServiceProxy(new Uri(org.OrganizationServiceUri),
           null, credentials, null))
{
   serviceProxy.Timeout = new TimeSpan(0, 10, 0);
   var response = os.Execute(new OrganizationRequest("RetrieveOrganizationInfo"));
}

Это работает - в некотором смысле CRM возвращает ответ, но клиент не может десериализовать его с помощью:

System.ServiceModel.Dispatcher.NetDispatcherFaultException
HResult = 0x80131501 Message = Форматировщик выдал исключение во время при попытке десериализации сообщения: произошла ошибка при попытке параметр десериализации http://schemas.microsoft.com/xrm/2011/Contracts/Services:ExecuteResult. Сообщение InnerException было «Ошибка в строке 1 позиции 1400. Элемент «http://schemas.datacontract.org/2004/07/System.Collections.Generic:value' содержит данные из типа, который отображается на имя http://schemas.microsoft.com/xrm/9.0/Contracts:OrganizationInfo'. deserializer не знает ни одного типа, который сопоставляется с этим именем. Рассмотрите возможность изменения реализации метода ResolveName на вашем DataContractResolver для возврата ненулевого значения для имени 'OrganizationInfo' и пространство имен http://schemas.microsoft.com/xrm/9.0/Contracts'.'. Пожалуйста, смотрите InnerException для более подробной информации.

Думаю, мне как-то не хватает отображения типов. Я пытался заменить DataContractResolver своим собственным

var contract = serviceProxy.ServiceConfiguration.CurrentServiceEndpoint.Contract;
var operation = contract.Operations.Find("Execute");
var behavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>();

behavior.DataContractResolver = new CustomDataContractResolver();

Но CustomDataContractResolver не вызывается. Есть какие-нибудь мысли, как подключиться к обработке контракта, чтобы это поведение можно было изменить?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Он был удален по ошибке и исправлен в последней версии Xrm Sdk.

Install-Package Microsoft.CrmSdk.CoreAssemblies -Version 9.0.2.12

// using Microsoft.Crm.Sdk.Messages from assembly Microsoft.Crm.Sdk.Proxy
var response = (RetrieveOrganizationInfoResponse)os.Execute(new RetrieveOrganizationInfoRequest());
0 голосов
/ 24 января 2019

Я тестировал сообщение RetrieveOrganizationInfoRequest некоторое время назад с более ранним v9.0 пакетом Microsoft.CrmSdk.CoreAssemblies NuGet.

Когда я увидел ваш вопрос, я запустил это решение и запустил его.Он работал нормально.

Затем я обновил все пакеты NuGet до последней версии (кроме IdentityModel).Это привело пакет CoreAssemblies к v9.0.2.5.Вот пакеты NuGet после обновления всех:

NuGet Packages

Это заставило это сообщение перестать работать, так как оно больше не найдено в пространстве имен Microsoft.Crm.Sdk.Messages.

Несмотря на то, что оно не выглядит хорошо документированным (или вовсе), сообщение RetrieveCurrentOrganizationRequest могло бы заменить его вместе с сообщением RetrieveCurrentOrganizationResponse .

Я протестировал это, и оно работает с ядром v9.0.2.5.

Retrieve

Также ... Обычно я используюзапрос классы напрямую, а не создание экземпляра OrganizationRequest с параметром имени.Ваш пример конструктора:
new OrganizationRequest("RetrieveOrganizationInfo")
не является допустимым именем запроса.Когда я использовал ваш синтаксис, я получил ту же ошибку, что и вы.
Когда я попробовал его как:
new OrganizationRequest("RetrieveOrganizationInfoRequest");
, я получил другую ошибку:

Exception

Кроме того, я высоко оцениваю вашу смелость в написании вашего собственного распознавателя.К счастью, получение поддерживаемого ответа от D365 никогда не должно быть таким сложным.

...