1

一連の統合テストから呼び出している次のスニペットがあります。

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); };

このデリゲートを明示的にnullに割り当てたとしても、同じテスト実行でWebClientに証明書エラーを再度スローさせることはできません。また、明示的にfalseを返すようにしました。名前付きデリゲート参照を追加してから削除しようとしましたが、単に割り当て/再割り当てするのではなく、コールバックでSslPolicyErrorsをチェックして、policyErrors == SslPolicyErrors.None何も機能しません。

(テスト環境の特定のURLが証明書の警告を返すことを明示的に確認しています。また、ユーザーが証明書の警告を無視すると、特定のページが表示されるため、証明書の処理が少し変わっていることも確認する必要があります)

何か案は?

4

2 に答える 2

2

System.Net.ServicePointManager.MaxServicePointIdleTimeを0に設定します

これがないと、接続チャネルは開いたままになるため、デリゲートコールは発生しません

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

于 2012-10-17T19:14:15.260 に答える
0

電話してください -

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

リクエストを作成する前に、あなたの場合は呼び出す前に

var wc = new WebClient();
于 2015-01-08T22:55:59.950 に答える