Web Api项目中的CrmServiceClient重用或连接池

时间:2016-12-21 21:13:45

标签: c# .net dynamics-crm-2011 dynamics-crm

我试图了解如何在Web Api项目中使用CRM SDK的CrmServiceClient,并想确认我的理解是否正确。

CrmServiceClient是否实现了连接池?如果是这样,为每个Web请求创建一个新实例是否有效,因为CrmServiceClient会减少创建新连接的开销?

或者我应该在整个应用程序中使用单个CrmServiceClient实例吗?我不认为这是有效的,因为我的理解是它不是线程安全的,最终连接将关闭(我认为)。

3 个答案:

答案 0 :(得分:1)

它在documentation for CrmServiceClient中说:

  

线程安全
  此类的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

(强调我自己)

我当然在我的应用程序中使用CrmServiceClient的一个静态实例,并且从未遇到过问题。

答案 1 :(得分:0)

我发现CrmServiceClient是线程安全的,如此处所述https://msdn.microsoft.com/en-us/library/dn688177.aspx使用CrmServiceClient类对Dynamics 365的所有调用都是线程安全的。

在我正在处理的应用程序中,我已经缓存了一个在整个应用程序中使用的CrmServiceClient实例。在使用之前,我检查IsReady属性。此单个实例用于在整个应用程序中实例化XrmServiceContext实例(使用块)。

此外,在我的测试中,似乎连接池不是由CrmServiceClient执行的。我做了一个测试,我调用了一个API端点100次,每次调用CrmServiceClient的实例化时间基本保持不变。我可能错了,但我认为它不会执行连接池。

答案 2 :(得分:0)

确实汇集了这种联系。在整个应用程序中使用单个连接是很常见的,但这取决于您想要完成的任务。将“RequireNewInstance = True”添加到连接字符串将在每次使用时创建新连接。我通常只在我创建需要同时推送更多数据的集成时执行此操作。