4

这是一个最佳实践问题。根据这篇最佳实践文章和 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则为空,如MSDN 所示

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

OrganizationServiceProxy (IServiceConfiguration, SecurityTokenResponse)

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

4

1 回答 1

1

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

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

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

当然,如果您不使用某些系统服务帐户,这根本不起作用。

于 2012-10-07T03:07:36.310 回答