我正在编写MVC 3 WebApp,它使用早期绑定使用XRM 2011。这是一个面向互联网的应用程序,托管在与Dynamics IIS不同的机器上。
这当然会非常频繁地调用OrganizationServiceProxy,并且每次第一次打击时响应都会很慢。
是否建议重复使用OrganizationServiceProxy连接,而不是每次都创建新实例?
如果是,
对不起MS网站的重复帖子。希望这个论坛更加活跃。
答案 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原始问题的解决方案,请查看here和here。以下是上面链接的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());
}