EWS - ServerBusyException?

时间:2014-07-01 17:42:11

标签: c# exchange-server exchangewebservices ews-managed-api

在我们公司从Exchange 2010升级到Exchange 2013之后,我发现了一个非常奇怪的怪癖。我使用EWS托管API为某些公用文件夹创建流式订阅。我有一些旧的Windows服务仍在运行,很高兴订阅,阅读新邮件,以及类似的东西。我有我的新项目,最终将取代这些旧的Windows服务,而我们在Exchange 2010上,它可以创建相同的流式订阅到相同的公共文件夹,而旧的Windows服务仍在运行。升级后,当我尝试打开StreamingSubscriptionConnection时,我现在收到ServerBusyException。如果我禁用所有旧版Windows服务,我可以在我的新项目中打开连接。

以下是我订阅的方式,没什么太花哨的:

    private StreamingSubscriptionConnection CreateStreamingSubscription(ExchangeService service, StreamingSubscription subscription)
    {
        var connection = new StreamingSubscriptionConnection(service, 30);
        connection.AddSubscription(subscription);
        connection.OnNotificationEvent += connection_OnNotificationEvent;
        connection.OnSubscriptionError += connection_OnSubscriptionError;
        connection.OnDisconnect += connection_OnDisconnect;

        try
        {
            connection.Open(); // <-- boom!
        }
        catch (ServerBusyException ex)
        {
            Log.Error("Connection to Exchange refused. Server is too busy.", ex);
            throw; // <-- this is the exception, it is specific
        }
        catch (Exception ex)
        {
            Log.Error("Unknown error connection to Exchange.", ex);
            throw;
        }


        return connection;
    }

在查看MSDN之后,有一个名为BackOffMilliseconds的属性,但它返回0表示Exchange实际上并没有告诉我稍后再试。我登录到Exchange服务器以检查限制策略,并应用了默认的全局策略。每个参数都包含&#39; concurrency&#39;在它超过10,所以我不认为这是一个限制政策问题。对于它的价值,我的遗留Windows服务和这个新项目都使用相同的服务帐户来完成它们的工作。

我还查看了服务连接的方式,并且无论是否设置为Exchange2013或Exchange2010_SP1都没有变化:

    private ExchangeService CreateExchangeService()
    {
        ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
        var service = new ExchangeService(ExchangeVersion.Exchange2013);
        service.Credentials = new WebCredentials(ExchangeUser, ExchangePassword, ExchangeDomain);
        service.AutodiscoverUrl(ExchangeEmail, RedirectionUrlValidationCallback);
        return service;
    }

最后,我检查了Fiddler,看看在这些订阅失败期间发生了什么,我看到一台无用的HTTP 500,同一台服务器忙,请稍后再试。

有关Exchange 2013与2010SP2中EWS API的更改的任何想法吗?

2 个答案:

答案 0 :(得分:4)

好像您正在达到内部部署Exchange 2013服务器的默认挂起连接限制3。您可以按照提到的here在web.config中覆盖它。基本上在web.config中的appSettings xml节点下添加以下节点(它将其设置为10)并重新启动MSExchangeServicesApppool:

add key =&#34; HangingConnectionLimit&#34;值=&#34; 10&#34; (附加xml标签)

可以在以下位置找到EWS应用程序池的web.config:C:\ Program Files \ Microsoft \ Exchange Server \ V15 \ ClientAccess \ exchweb \ ews。它可能因Exchange安装目录而异。

另请注意,需要在存在用户活动数据库的邮箱服务器上进行此更改。

答案 1 :(得分:2)

虽然订阅方面没有对EWS API进行任何更改 - 但Exchange在维护订阅的位置发生了更改。

在Exchange 2010中,订阅存储在CAS上,2013年它们存储在邮箱服务器上。

基于例外,我认为你确实受到了限制。有一组建议用于在2013年维护与邮箱服务器的关联,并避免在此主题中进行限制:How to: Maintain affinity between a group of subscriptions and the Mailbox server in Exchange。基本上,您将订阅分组并使用X-AnchorMailbox标头来路由请求。

还有一些细节可以解释为什么您可能会在此主题中看到ErrorServerBusy异常:Handling notification-related errors in EWS in Exchange

Matt Stehle也在这里写了博客:Changes in Managing Affinity for EWS Subscriptions…