如何在从CRM 2011中的IWorkflowContext访问的服务上启用ProxyTypes?

dynamics-crm-2011

4458 观看

5回复

14627 作者的声誉

我有一个C#工作流程,我正在尝试创建一个IOrganzationService已启用代理类型的内容,因此我可以使用我的早期绑定数据类型...

这就是我创造的方式 IOrganizationSerivce

IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

但由于我没有OrganizationServiceProxy对象,我无法在服务上调用EnableProxyTypes(),并且使用早期绑定实体对服务进行的任何创建调用都会失败。

我知道我可以恢复在app.config中设置服务器url url,sdk服务器url和组织并使用它来创建一个OrganizationServiceProxy但似乎我应该能够在我已经拥有的IOrganizationService上设置EnableProxyTypes。 ..

作者: Daryl 的来源 发布者: 2012 年 2 月 10 日

回应 (5)


0

71 作者的声誉

几个月前我发现了同样的问题。您遇到的问题是由于api中的不一致。

OrganizationServiceProxy实现IOrganizationService,它只有少数成员创建,更新等。它还从ServiceProxy继承成员ClientCredentials,IsAuthenticated,DeviceCredentials等。

现在您在界面或抽象基类上找不到的是EnableProxyTypes成员。

所以基本上你的运气好了。我结束使用具体的OrganizationServiceProxy。

看看这里,并为自己做比较。

http://technet.microsoft.com/en-us/library/microsoft.xrm.sdk.iorganizationservice_members.aspxhttp://technet.microsoft.com/en-us/library/microsoft.xrm.sdk.client。 organizationserviceproxy.aspxhttp://technet.microsoft.com/en-us/library/gg306039.aspxhttp://technet.microsoft.com/en-us/library/microsoft.xrm.sdk.client.organizationserviceproxy_methods。 ASPX

猜猜创建api的ms crm开发团队应该使用tdd和一个模拟框架在开发早期就把它拿起来。

干杯拉斯廷

作者: Rustin 发布者: 10.02.2012 07:33

4

4650 作者的声誉

决定

为了能够在工作流的上下文中使用早期绑定实体,请尝试以下代码段:

IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();

var type = Type.GetType("Microsoft.Crm.Workflow.SynchronousRuntime.WorkflowContext, Microsoft.Crm.Workflow, Version=5.0.0.0");
type.GetProperty("ProxyTypesAssembly").SetValue(serviceFactory, typeof(YourServiceContext).Assembly, null); //YourServiceContext - the name of crm context
IOrganizationService service = serviceFactory.CreateOrganizationService(context.InitiatingUserId); 

如您所见,有一个名为property的属性ProxyTypesAssembly,用于指定保存早期绑定实体的程序集。我可以设置此属性的唯一方法是使用反射,因为WorkflowContextBase(基类WorkflowContext)无法访问。

作者: Arabela Paslaru 发布者: 12.02.2012 01:36

1

10308 作者的声誉

CRM 2013(以及我希望的更多)的修复方法要简单得多:

IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();

// this is the important change
var property = serviceFactory.GetType().GetProperty("ProxyTypesAssembly");

property.SetValue(serviceFactory, typeof(YourServiceContext).Assembly, null);
IOrganizationService service = serviceFactory.CreateOrganizationService(context.InitiatingUserId); 
作者: Jon Grant 发布者: 07.10.2015 10:27

1

81 作者的声誉

使用反射的答案并不理想,您将无法在沙盒隔离模式下注册程序集。

您可以将以下内容添加到插件或工作流项目中的AssemblyInfo.cs文件的末尾。

[assembly: Microsoft.Xrm.Sdk.Client.ProxyTypesAssembly()]
作者: Frank Hiller 发布者: 29.08.2017 08:57

0

121 作者的声誉

这是一篇老帖子,解决了很久以前修复过的问题。但是这里提供的一些变通方法不受支持,并且会导致使用它们的工作流活动中断。

请参阅:删除在自定义工作流活动中使用反射的不受支持的代码

作者: Jim Daly -MSFT- 发布者: 14.08.2019 11:20
来自类别的问题 :
32x32