C# 为什么设置ServicePointManager.ServerCertificateValidationCallback=null不起作用?

C# 为什么设置ServicePointManager.ServerCertificateValidationCallback=null不起作用?,c#,.net,ssl-certificate,webclient,servicepointmanager,C#,.net,Ssl Certificate,Webclient,Servicepointmanager,我从一组集成测试中调用了以下代码段: 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 = n

我从一组集成测试中调用了以下代码段:

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。无
-没有任何效果

(我正在明确验证测试环境中的某些URL是否返回证书警告,并且我还需要验证,如果用户忽略证书警告,他们将看到特定页面,因此证书处理有点奇怪)


有什么想法吗?

将System.Net.ServicePointManager.MaxServicePointIdleTime设置为0

如果没有此选项,连接通道将保持打开状态,因此没有委托调用

你应该打电话-

ServicePointManager.ServerCertificateValidationCallback == delegate { return(true); };
在创建请求之前,对于您的情况,在调用之前

var wc = new WebClient();

将回调设置为return true将跳过无效证书,这是OP在后续测试中试图避免的。此外,赋值运算符是单个equals。