OrganizationServiceProxy的线程安全性和生成的xrm服务上下文

时间:2012-10-06 21:55:18

标签: dynamics-crm-2011

这是一个最佳实践问题。  根据此best practices article和每个MSDN,OrganizationServiceProxy不是线程安全的。

如果您有一个多线程客户端应用程序,您正在其中创建一个实例  OrganizationServiceContext(基于每个线程),其构造函数接受  IOrganizationService实例,您传入OrganizationServiceProxy的全局实例 (即在“进程级别”分配一次的静态实例),这将导致线程问题和/或如果OrganizationServiceProxy实例出现故障,它是否会影响线程尝试在其自己的“本地”实例上执行的操作OrganizationServiceContext

我的信念是它会,并且需要在“每个线程”的基础上创建OrganizationServiceProxy实例,并且多线程应用程序中的每个OrganizationServiceContext都需要拥有相应的 OrganizationServiceProxy实例。

我发布此内容以确认上述内容。

此外,文章指出

  

服务代理类使用以下类方法执行元数据下载和用户身份验证

IServiceManagement<IOrganizationService> orgServiceManagement =
                 ServiceConfigurationFactory.CreateManagement<IOrganizationService>(
                 new Uri(organizationUrl))

AuthenticationCredentials authCredentials = orgServiceManagement.Authenticate(credentials)
  

通过缓存服务管理和经过身份验证的凭据对象,您的应用程序可以更有效地为每个应用程序会话构建服务代理对象

如果我尝试手动执行上述API调用,则在Active Directory身份验证模式下,authCredentials.SecurityTokenResponse为空indicated by MSDN

有没有办法只针对AD模式执行一次身份验证,并通过以下构造函数将经过身份验证的 SecurityTokenResponse传递给新创建的OrganizationServiceProxy

OrganizationServiceProxy (IServiceConfiguration, SecurityTokenResponse)

这样,在为每个线程构建OrganizationServiceProxy实例时,您不必在每个线程的基础上执行身份验证和元数据下载,只需执行一次命中?

1 个答案:

答案 0 :(得分:1)

是的,如果您在单个IOrganization服务上尝试多线程操作,肯定会遇到问题。

我们有两个基本的多线程CRM应用程序:批处理器和另一个Web应用程序。对于批处理程序,我发现它最好只有10个不同的线程,并在10个不同的线程中批处理工作。因此,如果您要插入100,000条记录,请将它们分成10批10,000个,每个线程一个组织服务。

我们还有一个网站可以进行大量的CRM交互,因此没有真正的方法来批量处理请求,因此我们创建了一个CRM连接池来重用任何已经过身份验证的开放连接。

当然,如果你没有使用某个系统服务帐户,这根本不起作用。