你有幾個選項。第一個選項是使用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