XRM / Dynamics CRM 2011中OrganizationServiceProxy的连接/对象池

时间:2011-04-14 02:44:02

标签: object dynamics-crm-2011 pool xrm

我正在编写MVC 3 WebApp,它使用早期绑定使用XRM 2011。这是一个面向互联网的应用程序,托管在与Dynamics IIS不同的机器上。

这当然会非常频繁地调用OrganizationServiceProxy,并且每次第一次打击时响应都会很慢。

是否建议重复使用OrganizationServiceProxy连接,而不是每次都创建新实例?

如果是,

  1. 有什么可以管理连接,例如
    • 连接池应用 - MS或第三方/开源
    • 或某些框架,如WCF(从未使用过WCF)
  2. 如果我必须编写自己的代码来管理连接,建议使用哪种设计模式?
  3. 对不起MS网站的重复帖子。希望这个论坛更加活跃。

3 个答案:

答案 0 :(得分:2)

经过几个测试周期后,我发现使用CrmConection是最快的方法。与上面的缓存实现相比,CrmConnection运行速度至少快5倍。

CrmConnection connection = new CrmConnection("XrmConnectionString");   // Todo: Replace magic connection string
using (XrmVRC.XrmVrcServiceContext context = new XrmVRC.XrmVrcServiceContext(connection)) {
    // Processing...
}

答案 1 :(得分:1)

这是一个相当古老的问题,但对于仍然希望阅读此SDK Extensions for Microsoft Dynamics CRM 2011 and Microsoft Dynamics CRM Online的其他人来说。我相信这些扩展可以为您提供缓存/资源池。

有关OP原始问题的解决方案,请查看herehere。以下是上面链接的CRM SDK文档的引用:

  

Microsoft Dynamics CRM的Developer Extensions提供以下功能:

     
      
  • 与CrmConnection类(Microsoft.Xrm.Client)提供的Microsoft Dynamics CRM服务器的简化连接

  •   
  • 代码生成工具(CrmSvcUtil.exe)自定义提供的强类型代码生成

  •   
  • 用于启用CrmConfigurationManager类(Microsoft.Xrm.Client)提供的自定义扩展的App.config和Web.config可配置性

  •   
  • 通过缓存CachedOrganizationService类(Microsoft.Xrm.Client)提供的服务结果来提升性能

  •   
     

Portal Developer's Guide使您能够构建与Microsoft Dynamics CRM紧密集成的Web门户。有关详细信息,请参阅Microsoft Dynamics CRM 2011和Microsoft Dynamics CRM Online的门户开发人员指南。本指南证明了以下功能:

     
      
  • 安全管理(Microsoft.Xrm.Portal)

  •   
  • 缓存管理(Microsoft.Xrm.Portal)

  •   
  • 内容管理(Microsoft.Xrm.Portal,Microsoft.Xrm.Portal.Files,WebSiteCopy.exe)

  •   

答案 2 :(得分:0)

我还在 MS Forum 上发布了这个问题,在那里我得到了Pat的回复。

While it is somewhat limited, there is some direction regarding the caching of service connectivity in the SDK:

Performance Best Practises - Caching

The two primary suggestions being to:

    1. Cache the IServiceConfiguration class
    2. Monitor your WCF security token and refresh it before it expires 

基于该建议,我最终使用API​​示例代码中的以下类。如果有人有反馈或对/错/更好的建议,请告诉我。

就AppPool的管理而言,我仍在寻找信息。


1. ManagedTokenOrganizationServiceProxy
2. AutoRefreshSecurityToken
3. DeviceIdManager

我将以下连接字符串添加到web.config

<add name="XrmConnectionString" connectionString="ServiceUri=http://<MACHINE>:<PORTt>/<ORG>/XRMServices/2011/Organization.svc; Domain=<DOMAIN>; Username=<USERNAME>; Password=<PASSWORD>" />

然后我创建了以下类来创建连接。

/// <summary>Provides server connection information.</summary>
public class ServerConnection
{
    private static readonly ILog log = LogManager.GetLogger(typeof(ServerConnection));

    #region Public methods
    /// <summary>
    /// Obtains the OrganizationServiceProxy connection for the target organization's
    /// Uri and user login credentials from theconfiguration.
    /// </summary>
    public static OrganizationServiceProxy getServiceProxy() {
        ManagedTokenOrganizationServiceProxy serviceProxy = null;
        log.Debug("in getServiceProxy");
        try {
            CrmConnection crmConnection = new CrmConnection("XrmConnectionString");
            serviceProxy = new ManagedTokenOrganizationServiceProxy(crmConnection.ServiceUri, crmConnection.ClientCredentials);
            log.Debug("ManagedTokenOrganizationServiceProxy created = " + serviceProxy);
            serviceProxy.EnableProxyTypes();
        } catch (Exception e) {
            log.Fatal(e, e);
            throw;
        }
        log.Debug("Returning serviceProxy");
        return serviceProxy;
    }

    #endregion
}

以下MVC代码使用连接:

public ActionResult Index() {
    XrmVrcServiceContext context = null;
    try {
        context = new XrmVrcServiceContext(ServerConnection.getServiceProxy());
    } catch (Exception e) {
        log.Error(e, e);
        throw;
    }
    return View(context.new_XYZEntitySet.ToList());
}