2

C# で非同期ソケット API を使用すると、実際には呼び出し元のスレッドで DNS 解決が実行されるため、解決に問題がある場合はタイムアウトになるまでハングすることが最近発見されました。
QA がテストでも使用できるように、実行中のコードに触れることなく DNS 解決の問題をシミュレートする方法を見つけたいと考えています。

Insentive : WebRequest、Image (WinForms、WPF) などの多くの .NET 非同期 API は、呼び出し元のスレッドで DNS 解決を実行するため、UI がハングする可能性があります。

例: (私がシミュレートできるようにしたいこと)
DNS が解決に失敗した場合、コードは (1) に到達しませんが、(2) でタイムアウト遅延の後に EndGetResponse から例外がスローされます。

class Program
{
    static void Main()
    {
        var request = WebRequest.Create("http://www.google.com");
        request.BeginGetResponse(WebRequestCallback, request);
        // (1)
        Console.ReadLine();
    }
    private static void WebRequestCallback(IAsyncResult ar)
    {
        // (2)
        var response = ((WebRequest) ar.AsyncState).EndGetResponse(ar);
    }
}
4

1 に答える 1

0

Thx Hans、素晴らしいアイデアです。
正確な手順を追加します。

  1. コントロール パネル -> ネットワーク -> アダプターの設定の変更
  2. 使用する接続をダブルクリックします
  3. 使用する TCP プロトコルのプロパティ
  4. 高度
  5. DNS タブ
  6. DNS サーバーの IP を追加 (*)
  7. すべてのネットワーク ウィンドウを閉じる
  8. 実行: 「ipconfig /flushdns」

(*) 解決できるが DNS 応答を返さない IP である必要があります (google.com が適切です)。そうしないと、DHCP が応答を返す速度が速すぎてアドレスが解決できず、サーバーが存在する場合は応答を返さないためです。そのため、タイムアウトに達します。

于 2012-10-18T10:12:00.917 に答える