2

我正在编写一个使用 Early Bound 使用 XRM 2011 的 MVC 3 WebApp。这是一个面向 Internet 的应用程序,托管在与 Dynamics IIS 不同的机器上。

这当然会使 OrganizationServiceProxy 调用非常频繁,并且每次第一次点击时响应有点迟钝。

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

如果是,

  1. 有什么可以管理连接的,例如
    • 连接池应用程序 - MS 或第三方/开源
    • 或像 WCF 这样的框架(从未使用过 WCF)
  2. 如果我必须编写自己的代码来管理连接,推荐哪种设计模式?

很抱歉 MS 网站上的重复帖子。希望这个论坛更加活跃。

4

3 回答 3

2

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

CrmConnection connection = new CrmConnection("XrmConnectionString");   // Todo: Replace magic connection string
using (XrmVRC.XrmVrcServiceContext context = new XrmVRC.XrmVrcServiceContext(connection)) {
    // Processing...
}
于 2011-07-07T04:33:59.967 回答
1

这是一个相当老的问题,但对于其他仍在寻找的人来说,请阅读此SDK Extensions for Microsoft Dynamics CRM 2011 和 Microsoft Dynamics CRM Online。我相信扩展会为您处理资源的缓存/池化。

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

Microsoft Dynamics CRM 的开发人员扩展提供以下功能:

  • 由 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)

于 2012-05-09T07:51:55.020 回答
0

我还在MS 论坛上发布了这个问题,在那里我得到了 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());
}
于 2011-06-24T14:28:52.070 回答