Почему настройки ServicePointManager.ServerCertificateValidationCallback = null не работают?

У меня есть следующий фрагмент, который я вызываю из набора интеграционных тестов:

private void Url_Contains_String_With_Certificate_Warning(string url, string expected) {
  // This line should restore default cert validation behaviour
  ServicePointManager.ServerCertificateValidationCallback = null;
  var wc = new WebClient();
  try {
    wc.DownloadString(url);
    Assert.Fail("Should have thrown a WebException by now");
  } catch (WebException x) {
    Assert.That(x.InnerException is AuthenticationException, "Expected an AuthenticationException inside a WebException due to invalid certificate");
    Assert.AreEqual("The remote certificate is invalid according to the validation procedure.", x.InnerException.Message);
  }
  // This line overrides cert validation behaviour to accept invalid certs
  ServicePointManager.ServerCertificateValidationCallback = delegate { return(true); };
  var result = wc.DownloadString(url);
  Assert.That(result.Contains(expected), String.Format("Didn't find expected text '{0}' in HTML response", expected));
}

Тем не менее, только первый тест в любом данном тестовом прогоне пройдет... после того, как я запустил эту строку:

ServicePointManager.ServerCertificateValidationCallback = delegate { return(true); };

Я не могу заставить WebClient снова выдать ошибку сертификата в том же тестовом прогоне, даже если я просто назначу этому делегату значение null. Я также попытался явно вернуть false; Я попытался добавить именованную ссылку на делегат, а затем удалить ее, вместо того, чтобы просто назначать / переназначать и даже проверять ошибки SslPolicyErrors в обратном вызове и возвращать policyErrors == SslPolicyErrors.None - ничего не работает.

(Я явно проверяю, что определенные URL в нашей тестовой среде возвращают предупреждение о сертификате, и мне также нужно убедиться, что если пользователь игнорирует предупреждение о сертификате, он увидит определенную страницу, отсюда и немного странная обработка сертификата)

Есть идеи?

2 ответа

Установите для System.Net.ServicePointManager.MaxServicePointIdleTime значение 0

без этого канал связи остается открытым, следовательно, ни делегатский вызов

http://blogs.msdn.com/b/jpsanders/archive/2009/05/20/understanding-maxservicepointidletime-and-defaultconnectionlimit.aspx

Вам следует позвонить -

ServicePointManager.ServerCertificateValidationCallback == delegate { return(true); };

перед созданием запроса, в вашем случае перед звонком

var wc = new WebClient();
Другие вопросы по тегам