Я пытаюсь вызвать ПолучитьОрганизацияИнфоЗапрос. Проблема в том, что я не могу найти его в последнем 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 не вызывается. Любые мысли о том, как подключиться к обработке контрактов, чтобы это поведение можно было переопределить?





Некоторое время назад я тестировал сообщение RetrieveOrganizationInfoRequest с более ранним пакетом NuGet Microsoft.CrmSdk.CoreAssemblies версии 9.0.
Когда я увидел ваш вопрос, я запустил это решение и запустил его. Он работал нормально.
Затем я обновил все пакеты NuGet до последней версии (кроме IdentityModel). Это привело пакет CoreAssemblies к версии 9.0.2.5. Вот пакеты NuGet после обновления всех:
Это сообщение перестало работать, так как его больше нет в пространстве имён Microsoft.Crm.Sdk.Messages.
Хотя это не кажется хорошо задокументированным (или вообще не задокументировано), сообщение RetriveCurrentOrganizationRequest могло заменить его вместе с сообщением Получить ответ текущей организации.
Я протестировал это, и оно работает с основной сборкой v9.0.2.5.
Кроме того... Обычно я использую классы запросов напрямую, а не создаю экземпляр OrganizationRequest с параметром имени. Пример вашего конструктора: new OrganizationRequest("RetrieveOrganizationInfo")
не кажется допустимым именем запроса. Когда я использовал ваш синтаксис, я получил ту же ошибку, что и вы.
Когда пробовал как: new OrganizationRequest("RetrieveOrganizationInfoRequest");
У меня другая ошибка:
Кроме того, я высоко оцениваю вашу смелость в написании собственного распознавателя. К счастью, получение поддерживаемого ответа от 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());