调用RetrieveOrganizationInfoRequest时出现NetDispatcherFaultException

问题描述 投票:0回答:2

我想调用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'的类型的数据。反序列化器不知道映射到此名称的任何类型。考虑更改DataContractResolver上ResolveName方法的实现,以返回名称'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没有得到援引。有任何想法如何挂钩合同处理所以这种行为可以被覆盖?

c# dynamics-crm datacontractserializer
2个回答
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获得支持的响应应该永远不会那么复杂。


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());
© www.soinside.com 2019 - 2024. All rights reserved.