这是一个最佳实践问题。
根据此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
实例时,您不必在每个线程的基础上执行身份验证和元数据下载,只需执行一次命中?
答案 0 :(得分:1)
是的,如果您在单个IOrganization服务上尝试多线程操作,肯定会遇到问题。
我们有两个基本的多线程CRM应用程序:批处理器和另一个Web应用程序。对于批处理程序,我发现它最好只有10个不同的线程,并在10个不同的线程中批处理工作。因此,如果您要插入100,000条记录,请将它们分成10批10,000个,每个线程一个组织服务。
我们还有一个网站可以进行大量的CRM交互,因此没有真正的方法来批量处理请求,因此我们创建了一个CRM连接池来重用任何已经过身份验证的开放连接。
当然,如果你没有使用某个系统服务帐户,这根本不起作用。