调用RetrieveOrganizationInfoRequest时发生NetDispatcherFaultException

时间:2019-01-24 12:52:04

标签: c# dynamics-crm datacontractserializer

我正在尝试调用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消息=格式化程序在   尝试反序列化消息:尝试执行以下操作时出错   反序列化参数   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'。的   解串器不知道任何映射到该名称的类型。   考虑更改您的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 :(得分:0)

一段时间以前,我已经使用较早的v9.0 Microsoft.CrmSdk.CoreAssemblies NuGet软件包测试了RetrieveOrganizationInfoRequest消息。

当我看到您的问题时,我启动了该解决方案并运行了它。一切正常。

然后,我将所有NuGet软件包更新为最新版本(IdentityModel除外)。这将CoreAssemblies软件包带到了v9.0.2.5。 这是所有更新后的NuGet软件包:

NuGet Packages

这使该消息停止工作,因为在Microsoft.Crm.Sdk.Messages名称空间中不再找到该消息。

尽管似乎没有(或根本没有)记录在案,但RetrieveCurrentOrganizationRequest消息可能已与RetrieveCurrentOrganizationResponse消息一起被取代。

我对此进行了测试,并且可以与v9.0.2.5核心程序集一起使用。

Retrieve

也...我通常直接使用请求类,而不是使用name参数实例化OrganizationRequest。您的构造函数示例:
new OrganizationRequest("RetrieveOrganizationInfo")
似乎不是有效的请求名称。当我使用您的语法时,会遇到与您相同的错误。
当我尝试为:
new OrganizationRequest("RetrieveOrganizationInfoRequest");
我遇到了另一个错误:

Exception

此外,我赞扬您在编写自己的解析器时的勇敢精神。幸运的是,从D365获得受支持的响应绝不会那么复杂。

答案 1 :(得分:0)

它被误删除并已在最新的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());