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

C# 重用EWS连接并协商Exchange的身份验证,c#,exchange-server,exchangewebservices,C#,Exchange Server,Exchangewebservices,我正在编写一个程序,使用C#中的EWS从Exchange服务器转储大量邮箱的内容。使用fiddler,我注意到我发送的每个请求都会建立一个新的连接(隧道),并执行一个新的身份验证过程(使用协商)。每次请求都会调用我的ServerCertificateValidationCallback 如果我在Fiddler中启用“重用服务器连接”选项,则连接仅在握手过程中创建,并可用于所有请求(节省大量时间) 通过获取EWS源并修改在请求对象上启用“UnsafeAuthenticatedConnectionS

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

如果我在Fiddler中启用“重用服务器连接”选项,则连接仅在握手过程中创建,并可用于所有请求(节省大量时间)

通过获取EWS源并修改在请求对象上启用“UnsafeAuthenticatedConnectionSharing”时发现的请求,连接将被重新使用(额外的隧道和ServerCertificateValidationCallbacks将消失),但每个请求仍然需要完全握手身份验证。这是因为当我尝试使用exchange 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;
}
公共类交换
{
静态int Main(字符串[]args)
{
sslCertCheckCount=0;
ServicePointManager.ServerCertificateValidationCallback=ServerCertificateValidation;
ExchangeService服务=新的ExchangeService(ExchangeVersion.Exchange2010_SP1);
service.Credentials=新的网络凭据(args[1],args[2]);
service.Url=新的Uri(args[0]+@/EWS/exchange.asmx”);
service.KeepAlive=true;
service.PreAuthenticate=true;
//service.UnsafeAuthenticatedConnectionSharing=true;
Folder Folder=Folder.Bind(服务,WellKnownFolderName.Inbox,新属性集(FolderSchema.Id,FolderSchema.DisplayName));
FindItemsResults=folder.FindItems(新项目视图(int.MaxValue));
返回0;
}
公共静态布尔服务器CertificateValidation(对象obj、X509Certificate证书、X509Chain-chain、System.Net.Security.SslPolicyErrors)
{
Console.WriteLine(String.Format(“***************************服务器CertificateValidation-计数:{0}.*******************”,++sslCertCheckCount));
返回true;
}
静态int-sslCertCheckCount;
}

谢谢

因此,在我修改了EWS API以允许在HttpRequests上启用未经验证的连接共享后,我的连接和验证实际上被重新使用


Fiddler是在我禁用“工具->Fiddler选项->连接->重用服务器连接”选项后删除我的连接的人。在exchange server计算机上运行wireshark表明,当fiddler使用此选项禁用捕获时,正在设置FIN TCP标志,从而结束会话。但是没有fiddler捕获连接和会话,它们都被重新使用。

您好,欢迎光临!如果您还没有,那么您应该学习,我建议您阅读如何提供示例。你的代码很长,有一个简单的例子会有帮助!