是否有OrganizationService连接保持活动状态

时间:2014-11-26 16:32:06

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

我有一个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

非常感谢。

1 个答案:

答案 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示例的略微修改版本,如果您需要更多帮助或信息,请与我们联系。