NetDispatcherFaultException при вызове 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=The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://schemas.microsoft.com/xrm/2011/Contracts/Services:ExecuteResult. The InnerException message was 'Error in line 1 position 1400. Element 'http://schemas.datacontract.org/2004/07/System.Collections.Generic:value' contains data from a type that maps to the name 'http://schemas.microsoft.com/xrm/9.0/Contracts:OrganizationInfo'. The deserializer has no knowledge of any type that maps to this name. Consider changing the implementation of the ResolveName method on your DataContractResolver to return a non-null value for name 'OrganizationInfo' and namespace 'http://schemas.microsoft.com/xrm/9.0/Contracts'.'. Please see InnerException for more details.

Я предполагаю, что мне как-то не хватает сопоставления типов. Пробовал заменить DataContractResolver на свой вроде

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

behavior.DataContractResolver = new CustomDataContractResolver();

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
243
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

NuGet Packages

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

Хотя это не кажется хорошо задокументированным (или вообще не задокументировано), сообщение RetriveCurrentOrganizationRequest могло заменить его вместе с сообщением Получить ответ текущей организации.

Я протестировал это, и оно работает с основной сборкой v9.0.2.5.

Retrieve

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

Exception

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

Ответ принят как подходящий

Он был удален по ошибке и исправлен в последней версии 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());

Другие вопросы по теме