У вас есть несколько вариантов. Первый вариант — использовать класс 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.
}
Я не мог понять, можно ли использовать ServicePoint прокси-сервером WCF. Если это невозможно, этот параметр не будет работать для 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;
}
person
Andy Wilson
schedule
19.08.2010