4

我们正在开发允许我们的自定义调度应用程序(主角色)与 Microsoft Exchange Server 2010/2007(从角色)同步的软件。我们的解决方案基于 .NET 4.0、EWS 托管 API 和 Parallel Fx,当然还有我们自己的 C# 代码。我们特别注意了“ExchangeService”类实例不会被多个线程同时使用的事实,并且对于实例总数是保守的(我们目前在任何给定时间都有 10 个活动实例)。然而,我们确实进行了很多调用(FindItems、CreateItems、UpdateItems、DeleteItems、LoadPropertiesForItems)。

深入挖掘,我们发现这种方法并没有给我们带来太多好处。每当发出操作时,都会创建、执行和关闭一个新的 HttpWebRequest。对于经过身份验证的请求(在我们的例子中:https + WebCredentials),似乎底层 tcp 连接以 TIME_WAIT 状态返回到操作系统(如本文所述:msdn.microsoft.com/en-us/library/aa560610( BTS.10).aspx) 并坐在那里,4 分钟内什么都不做(默认情况下)。我们已经应用了上述文章中的建议(进一步的讨论可以在这里找到:blogs.msdn.com/b/dgorti/archive/2005/09/18/470766.aspx),并将“坐在那里”的时间减少到 30秒。在测试环境中这一切都很好,但在 tcp 连接是一种更稀缺的资源并且我们的应用程序不是唯一使用它们的生产系统上就不行了。

我认为问题与 EWS 托管 API 如何使用 HttpWebRequest(甚至在 System.Net 中更深入)有关。我们想玩弄 msdn.microsoft.com/en-us/library/system.net.httpwebrequest.unsafeauthenticatedconnectionsharing.aspx 和 msdn.microsoft.com/en-us/library/6y3d5dts.aspx 但因为 EWS 托管 API 中的所有内容要么是内部的,要么是密封的,因此很难扩展/尝试一下。

欢迎提供如何进行的建议!

4

0 回答 0