简体   繁体   English

将代理PAC与EWS API结合使用

[英]Using Proxy PAC with EWS API

I have a web application that calls the EWS Managed API to connect to office365. 我有一个Web应用程序,该应用程序调用EWS托管API连接到office365。

I've followed the Get started with EWS Managed API 2.0 client applications documentation on MSDN. 我遵循了MSDN上的EWS Managed API 2.0客户端应用程序入门文档。

In the web.config I've specified the proxy pac: web.config我指定了代理pac:

<configuration>
  <system.net>
    <defaultProxy useDefaultCredentials="false">
      <proxy autoDetect="False" bypassonlocal="True" scriptLocation="http://example.com:8080/proxy.pac" usesystemdefault="False" />
    </defaultProxy>
  </system.net>
  [...]
</configuration>

And I try to connect to Exchange in the following way: 我尝试通过以下方式连接到Exchange:

public static ExchangeService getExchangeService(String username)
{
    ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;

    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
    service.Credentials = new WebCredentials(USER_365, PWD_365, DOMAIN_365);
    service.UseDefaultCredentials = true;

    //I've tried both WebProxy settings, this:
    service.WebProxy = WebRequest.GetSystemWebProxy();
    //And this (with no success):
    //service.WebProxy = WebRequest.DefaultWebProxy;

    //I've also tried Autodiscover...
    service.AutodiscoverUrl(USER_365, RedirectionUrlValidationCallback);
    //...and direct url
    //service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");

    service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, username);

    return service;
}

And the following are the method copied & pasted from MSDN: 以下是从MSDN复制和粘贴的方法:

private static bool RedirectionUrlValidationCallback(string redirectionUrl)
{
    // The default for the validation callback is to reject the URL.
    bool result = false;

    Uri redirectionUri = new Uri(redirectionUrl);

    // Validate the contents of the redirection URL. In this simple validation
    // callback, the redirection URL is considered valid if it is using HTTPS
    // to encrypt the authentication credentials. 
    if (redirectionUri.Scheme == "https")
    {
        result = true;
    }
    return result;
}

private static bool CertificateValidationCallBack(object sender,
    System.Security.Cryptography.X509Certificates.X509Certificate certificate,
    System.Security.Cryptography.X509Certificates.X509Chain chain,
    System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    // If the certificate is a valid, signed certificate, return true.
    if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
    {
        return true;
    }

    // If there are errors in the certificate chain, look at each error to determine the cause.
    if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
    {
        if (chain != null && chain.ChainStatus != null)
        {
            foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
            {
                if ((certificate.Subject == certificate.Issuer) &&
                   (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
                {
                    // Self-signed certificates with an untrusted root are valid. 
                    continue;
                }
                else
                {
                    if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
                    {
                        // If there are any other errors in the certificate chain, the certificate is invalid,
                        // so the method returns false.
                        return false;
                    }
                }
            }
        }

        // When processing reaches this line, the only errors in the certificate chain are 
        // untrusted root errors for self-signed certificates. These certificates are valid
        // for default Exchange server installations, so return true.
        return true;
    }
    else
    {
        // In all other cases, return false.
        return false;
    }
}

I tried to comment out the line: 我试图注释掉这一行:

//service.Url = new Uri("https://outlook.office365.com/ews/Exchange.asmx");

And add the Autodiscover: 并添加自动发现:

service.AutodiscoverUrl(username);

Set the proxy or not, comment out the line: 是否设置代理,将以下行注释掉:

ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;

But it seems that the ExchangeService calls directly the server without passing trough the proxy... what am I missing? 但是,似乎ExchangeService无需通过代理即可直接调用服务器……我缺少什么?

Thanks 谢谢

Try to remove bypassonlocal attribute altogether from your proxy configuration in web.config. 尝试从web.config中的代理配置中完全删除bypassonlocal属性。 There is an issue with setting this attribute along with scriptLocation. 将此属性与scriptLocation一起设置存在问题。

For more info: https://blogs.msdn.microsoft.com/rickrain/2011/03/25/why-scriptlocation-may-not-work-when-pointing-to-a-proxy-script-file-in-your-application-config-file/ 有关更多信息: https : //blogs.msdn.microsoft.com/rickrain/2011/03/25/why-scriptlocation-may-not-work-when-pointing-to-a-proxy-script-file-in-您的应用程序配置文件/

Also the web.config default proxy configuration should be sufficient so you can remove any proxy setting in your code. 另外,web.config默认代理配置也应足够,因此您可以在代码中删除任何代理设置。

Maybe that's the case here. 也许就是这种情况。

UPDATE : Specifying pac script location in proxyaddress instead of scriptLocation attribute in web.config should resolve this issue. 更新 :在proxyaddress指定pac脚本位置而不是在web.config中指定scriptLocation属性可以解决此问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM