你有几个选项。第一个选项是使用ServicePointManager类。你是在它管理的所有服务点是正确的,但你可以使用“发件人”参数中的回调方法不同的服务点之间进行区分:
void SomeMethod()
{
ServicePointManager.ServerCertificateValidationCallback +=
ValidateServerCertificate;
var url = "https://mail.google.com/mail/?shva=1#inbox";
var request = (HttpWebRequest)WebRequest.Create(url);
request.GetResponse();
}
private static bool ValidateServerCertificate(object sender,
X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslpolicyerrors)
{
if(sender is HttpWebRequest)
{
var request = (HttpWebRequest) sender;
if(request.RequestUri.ToString() == "https://mail.google.com/mail/?shva=1#inbox")
{
return (certificate.GetPublicKeyString() == "The public key string you expect");
}
}
return true;
}
此选项将手动创建的HttpWebRequest和WCF工作创建的请求,因为“发件人”将是HttpWebRequest。我不确定“发件人”是否是除HttpWebRequest之外的任何内容。
的第二个选择是直接从服务点拿到证书:
void SomeMethod()
{
ServicePointManager.ServerCertificateValidationCallback +=
ValidateServerCertificate;
var url = "https://mail.google.com/mail/?shva=1#inbox";
var request = (HttpWebRequest)WebRequest.Create(url);
request.GetResponse();
var serverCert = request.ServicePoint.Certificate;
// Validate the certificate.
}
我无法弄清楚是否有可能得到一个WCF代理使用的ServicePoint。如果这是不可能的,这个选项将不适用于WCF。除此之外,最大的区别是,如果证书验证失败,第一个选项将阻止连接,而第二个方法将在连接建立之后才会生效。
如果你只是需要确定一个请求会通过代理:
var httpRequest = (HttpWebRequest)WebRequest.Create("someurl");
var isUsingProxy = DoesRequstUseProxy(request);
bool DoesRequestUseProxy(HttpWebRequest request)
{
if(request.Proxy == null)
{
return false;
}
return request.Proxy.GetProxy(request.RequestUri) != request.RequestUri;
}
请问你的应用程序进行安全连接? WCF? HttpWebRequest的? – 2010-08-19 15:19:59
我正在寻找一种通用解决方案,它将解决所有基于.NET的通信方法。是的,我正在使用WCF和HTTPWebRequest – LamonteCristo 2010-08-19 15:21:54