我有一个Web API项目,它连接到CRM 2011实例以收集一些数据。一旦创建了运行Web API项目的服务器的初始连接,应用程序就会可靠地运行并在可接受的时间内返回该数据。
问题是如果需要重新创建此连接,因为它已被IIS关闭(有时连接可以在10到20秒内被IIS关闭)正在浏览UI的用户(调用Web API项目)可以坐在那里痛苦10-15秒,然后才能刷新网格。
连接需要相当长的时间才能建立我会想,因为Web服务器(运行Web API的服务器)和CRM 2011服务器之间有一个ISA服务器。
我已经测试过,通过在Web服务器上启动IE并简单地浏览CRM实例,需要很长时间才能重新建立连接。一旦建立连接,非常快。如果我让IE静坐一分钟并刷新一个网格,等待时间为10-15秒。
我知道可以在web.config
中配置一些缓存,但根据我的经验,这会导致用户浏览UI(由Web API应用程序提供)的问题不会完全看到在缓存刷新之前,我们的CRM实例中保存了实际数据。
所以我只是想知道是否有办法延长运行Web API项目的Web服务器与CRM实例之间的连接生命周期。
这可能来自web.config
文件吗?这是我的配置文件的相关部分:
<connectionStrings>
<add name="Xrm" connectionString="Server=https://crm.ourdomain.ca/org" />
</connectionStrings>
<microsoft.xrm.client>
<contexts>
<add name="Xrm" type="XrmPortal.Service.XrmServiceContext, CustomerPortal.WebAPI" />
</contexts>
<services>
<add name="Xrm" type="Microsoft.Xrm.Client.Services.OrganizationService, Microsoft.Xrm.Client" />
</services>
</microsoft.xrm.client>
以下是我在Web API项目中连接CRM的方法:
using (XrmServiceContext xrm = new XrmServiceContext())
{
var contact = xrm.ContactSet.SingleOrDefault(x=>x.Id == theGuid);
}
XrmServiceContext
继承Microsoft.Xrm.Client.CrmOrganizationServiceContext
非常感谢。
答案 0 :(得分:0)
由于您已经连接到CRM 2011 Web API,因此在连接到服务时可以使用SDK中的示例:
private readonly AutoRefreshSecurityToken<OrganizationServiceProxy, IOrganizationService> _proxyManager;
然后在每次进行调用或需要时使用_proxyManger更新令牌。
protected override void AuthenticateCore()
{
_proxyManager.PrepareCredentials();...
和
protected override void ValidateAuthentication()
{
_proxyManager.RenewTokenIfRequired();...
这就是续订方法的样子:
/// <summary>
/// Renews the token (if it is near expiration or has expired)
/// </summary>
public void RenewTokenIfRequired()
{
if (null == _proxy.SecurityTokenResponse
|| !(DateTime.UtcNow.AddMinutes(15) >= _proxy.SecurityTokenResponse.Response.Lifetime.Expires)) return;
try
{
_proxy.Authenticate();
}
catch (CommunicationException)
{
if (null == _proxy.SecurityTokenResponse ||
DateTime.UtcNow >= _proxy.SecurityTokenResponse.Response.Lifetime.Expires)
throw;
// Ignore the exception
}
}
这是SDK示例的略微修改版本,如果您需要更多帮助或信息,请与我们联系。