EWS - ServerBusyException?
本文关键字:ServerBusyException EWS | 更新日期: 2023-09-27 18:10:56
在我们公司从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服务器以检查节流策略,并且应用了默认的全局策略。每个包含"并发"一词的参数都大于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有什么变化吗?
似乎您达到了默认的挂起连接限制,即本地Exchange 2013服务器的挂起连接限制为3。你可以在web中重写它。配置这里提到的。基本上在web的appSettings xml节点下添加以下节点。配置(它将其设置为10)并重启msexchangeservicesappool:
add key="HangingConnectionLimit" value="10"(追加xml标签)
网络。配置EWS应用程序池可以在:C:'Program Files'Microsoft'Exchange Server'V15'ClientAccess'exchweb' EWS中找到。它可能因Exchange安装目录而异。
还请注意,此更改需要在存在用户活动数据库的邮箱服务器上进行。
虽然EWS API在订阅方面没有变化,但Exchange本身更改了维护订阅的位置。
在Exchange 2010中,订阅存储在CAS上,在2013中,它们存储在邮箱服务器上。
基于这个例外,我认为你确实被限制了。在本主题中有一组关于在2013年维护与邮箱服务器的关联并避免节流的建议:如何:在Exchange中维护一组订阅与邮箱服务器之间的关联。基本上,您将订阅分组并使用X-AnchorMailbox头来路由请求。
在本主题中有关于您可能看到ErrorServerBusy异常的具体原因:在Exchange中处理EWS中与通知相关的错误。
Matt Stehle也在这里写了一篇博文:EWS订阅管理关联的变化....