在我们公司从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的更改的任何想法吗?
答案 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…。