在C#中如何释放/关闭ExchangeService?

20

我正在使用ExchangeService WebService API (Microsoft.Exchange.WebServices.Data),但我找不到任何CloseDispose方法。

关闭连接是否不必要?

我的方法如下:

public void CheckMails()
{
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
    IMAPCredentials creds = new IMAPCredentials();
    service.Credentials = new NetworkCredential(creds.User, creds.Pass, creds.Domain);
    service.AutodiscoverUrl(creds.User + "@example.com");

    // not the real code from here on but you'll get the idea...
    // var emails = service.FindItems();
    // emails[0].Load();
    // emails[0].Attachments[0].Load();
    // ...
}
3个回答

26

ExchangeService类没有Close/Dispose方法,因为该类并不维护与Web服务的连接。相反,会在需要时创建和关闭新的HTTP连接。

例如,当您调用ExchangeService.FindItems时,会在方法调用期间创建并关闭到Exchange服务器的新HTTP连接。


你仍然需要关闭WCF服务,并且在使用“using”包装它们时存在一个讨厌的错误,这就是我询问的原因。感谢解释! - Simon Woker
1
@SimonWoker:我一直在想ExchangeService类在Close/Dispose方面是如何工作的,这就是为什么我一直在深入研究它的原因。请注意,EWS不是WCF服务,因为它是以“老式”的ASMX方式实现的。 - Jakob Christensen
@JakobChristensen:当我们尝试使用相同的凭据多次连接EWS时,连接5次后会出现权限被拒绝的错误。这是否意味着EWS在一定时间内保持连接并不允许更多的连接? - Naresh
@Naresh:我非常确定EWS Managed API允许您进行任意数量的调用。正如我在上面的答案中所写的,EWS Managed API不维护连接。我对设置Exchange服务器知之甚少,但我认为您正在经历的与Exchange服务器上的EWS限制有关。很抱歉我不能给您更好的答案。也许这篇文章对您有帮助:http://msdn.microsoft.com/en-us/library/office/jj945066(v=exchg.150).aspx - Jakob Christensen
我发现ExchangeService存在一个问题,即连接会处于TIME_WAIT状态,而默认情况下将持续4分钟。如果您频繁轮询Exchange,则会出现端口耗尽的问题。虽然理想的解决方案是使用订阅来维护一个打开的连接。 - tjmoore

2
我知道这篇文章已经很老了,但最近我也遇到了同样的问题。我们连接到邮箱后出现了问题,然后不久之后再尝试相同的方法,就会出现HTTP异常。等待一分钟左右后,我们就可以重新连接……但是像接受答案的评论所说,这可能是Exchange服务器上的设置问题。
从技术上讲,由于ExchangeService没有实现IDisposable,因此没有必要释放连接,也不能将实例包装在using语句中。

0
private static void ProcessMail()
{
    ExchangeService exchange = new ExchangeService();
    exchange.Credentials = new WebCredentials(sACCOUNT, sPASSWORD, sDOMAIN);
    exchange.AutodiscoverUrl(sEMAIL_ADDRESS);

    if (exchange != null)
    {
        Folder rootFolder = Folder.Bind(exchange, WellKnownFolderName.Inbox);
        rootFolder.Load();

        foreach (Folder folder in rootFolder.FindFolders(new FolderView(100)))
        {
            //your code
        }
        exchange = null;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接