C# 禁用OrganizationServiceProxy的代理类型
我使用的是预定义的C# 禁用OrganizationServiceProxy的代理类型,c#,dynamics-crm,xrmtoolbox,C#,Dynamics Crm,Xrmtoolbox,我使用的是预定义的IOrganizationService对象,无法修改,这超出了我的控制范围 默认情况下,此ioOrganizationService返回解析的类型,就好像EnableProxyTypes()在原始OrganizationServiceProxy上的某个位置被隐式调用一样 这破坏了所有的业务逻辑,因为早期绑定的实体不能那么容易地序列化,因为在不同的安装上,它们可以解析为不同的类型。因此,即使它们将成功序列化,也无法100%确定它们是否可以反序列化 更具体地说,它是用于XrmTo
IOrganizationService
对象,无法修改,这超出了我的控制范围
默认情况下,此ioOrganizationService
返回解析的类型,就好像EnableProxyTypes()
在原始OrganizationServiceProxy
上的某个位置被隐式调用一样
这破坏了所有的业务逻辑,因为早期绑定的实体不能那么容易地序列化,因为在不同的安装上,它们可以解析为不同的类型。因此,即使它们将成功序列化,也无法100%确定它们是否可以反序列化
更具体地说,它是用于XrmToolBox
的插件。如果宿主应用程序加载了使用早期边界的插件,这些生成的类型将通过反射发现,并应用于Retrieve
和RetrieveMultiple
调用的结果
例如,RetrieveMultiple
toaccount
实体响应通常包含entity[]
,此数组的每个项都将LogicalName
属性设置为account
但是,如果在程序集中发现了早期绑定类型,我们将其称为EarlyBouldLibrary.dll
,相同的RetrieveMultiple
将返回EarlyBouldLibrary.Account[]
。此数组的每个项都将从实体
派生,并将包含与第一个示例中相同的字段,但具有附加属性
问题在于以下几点。如果我们尝试将EarlyBouldLibrary.Account[]
序列化为XML
它将失败。因为EarlyBouldLibrary.Account
未知
好的,可以将类型添加到已知的。但不能保证有一天会在NewEarlyBouldLibrary.dll
中找到另一个早期绑定类型。。。他们将拥有名称NewEarlyBouldLibrary.Account
。。。这是未知的
好的,让我们假设序列化成功,不管引用了哪种类型EarlyBouldLibrary.Account
或NewEarlyBouldLibrary.Account
,但如果我们尝试反序列化,在这些早期绑定库不存在的环境中。。。行动将失败
所以,唯一的方法是不要使用特定的早期绑定类型,即我们无法控制的类型,而是使用标准和安全的实体。但当系统自动解析代理类型时,这是不可能的
所以,问题是:有没有办法禁用早期绑定类型的解析 您可以将代理重定向到另一个包含所需类型的程序集(甚至不包含任何早期绑定类型)
以下示例重置代理程序集:
private void ResetProxyAssembly(IOrganizationService service)
{
var serviceProxy = (OrganizationServiceProxy) service;
serviceProxy.EnableProxyTypes();
}
private void ResetProxyAssembly(IOrganizationService service)
{
var serviceProxy = (OrganizationServiceProxy) service;
serviceProxy.EnableProxyTypes(typeof(MyEarlyBoundEntity).Assembly);
}
在某些情况下,这可能不起作用。相反,您可以显式选择所需的代理程序集:
private void ResetProxyAssembly(IOrganizationService service)
{
var serviceProxy = (OrganizationServiceProxy) service;
serviceProxy.EnableProxyTypes();
}
private void ResetProxyAssembly(IOrganizationService service)
{
var serviceProxy = (OrganizationServiceProxy) service;
serviceProxy.EnableProxyTypes(typeof(MyEarlyBoundEntity).Assembly);
}
能否将[assembly:Microsoft.Xrm.Sdk.Client.ProxyTypesAssembly]
添加到EarlyBouldLibrary.dll
或NewEarlyBouldLibrary.dll
程序集的AssemblyInfo文件中?我不明白你的问题,你能扩展或举例说明这个序列化问题吗?@GuidoPreite我有扩展说明来解释这个问题。你们能再看一下吗?这不是一个直接的答案,但我想把早期绑定类型转换回实体可能会有所帮助。relatedEntity.ToEntity()@Davlumbaz很好的解决方法!若并没有绑定早期绑定类型,我将尝试并添加一些处理。若看到一些带有ErrorDot的代码不适用于我的特定情况,可能会有所帮助。第一步失败-强制转换到OrganizationServiceProxy
。但这个想法很好,可能会在其他情况下奏效!您的场景是插件还是工作流活动?