重用EWS连接并协商Exchange的身份验证

时间:2015-05-11 01:58:03

标签: c# exchange-server exchangewebservices

我正在编写一个程序,使用C#中的EWS从Exchange服务器转储大量邮箱的内容。使用fiddler我注意到我发送的每个请求都建立了一个新的连接(隧道),并且正在进行新的身份验证过程(使用协商)。每次请求都会调用我的ServerCertificateValidationCallback。

如果我在Fiddler中启用选项以“重用服务器连接”,那么只在握手期间创建连接,并且重新用于所有请求(节省大量时间)。

通过获取EWS源并修改我发现的请求,如果我在请求对象上启用“UnsafeAuthenticatedConnectionSharing”而不是重新连接(额外的隧道和ServerCertificateValidationCallbacks消失),但每个请求仍然需要完整的握手身份验证。这是因为当我尝试使用交换cookie时,服务器会发回401。

有什么方法可以重新使用我的服务器连接&认证吗

public class EwsExchange
{
    static int Main(string[] args)
    {
        sslCertCheckCount = 0;
        ServicePointManager.ServerCertificateValidationCallback = ServerCertificateValidation;

        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
        service.Credentials = new NetworkCredential(args[1], args[2]);
        service.Url = new Uri(args[0] + @"/EWS/exchange.asmx");
        service.KeepAlive = true;
        service.PreAuthenticate = true;
        //service.UnsafeAuthenticatedConnectionSharing = true;

        Folder folder = Folder.Bind(service, WellKnownFolderName.Inbox, new PropertySet(FolderSchema.Id, FolderSchema.DisplayName));
        FindItemsResults<Item> res = folder.FindItems(new ItemView(int.MaxValue));

        return 0;
    }

    public static bool ServerCertificateValidation(Object obj, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors errors)
    {
        Console.WriteLine(String.Format(" ****************** ServerCertificateValidation - count: {0}. ****************** ", ++sslCertCheckCount));
        return true;
    }

    static int sslCertCheckCount;
}

谢谢!

1 个答案:

答案 0 :(得分:0)

事实证明,在我修改EWS API以允许我在HttpRequests上启用UnsafeAuthenticatedConnectionSharing后,我的连接和身份验证实际上正在被重用。

在禁用“工具 - &gt; Fiddler选项 - &gt;连接 - &gt;重用服务器连接”选项后,Fiddler放弃了我的连接。在Exchange服务器计算机上运行wireshark显示当fiddler在禁用此选项的情况下捕获时,正在设置FIN TCP标志,从而结束会话。但没有提琴手捕捉连接和会话都被重复使用。