2

HttpClient や await/async などの新しい fw 4.5 機能に従って古いネットワーク認証ロジックを書き直そうとしていますが、要求と応答の間に予期しない遅延 (約 15 秒) が発生します。私の推測では、古い HttpRequest/WebClient の場合と同様に、クライアントが IE からプロキシを検索/使用しようとするために発生します。コードは次のとおりです。

public static async Task<AuthResult> GetDataFromServiceAsync(string url, string login, string password)
{
     Debug.WriteLine("[" + DateTime.Now + "] GetDataFromServiceAsync");
     var handler = new HttpClientHandler { Credentials = new NetworkCredential(login, password)/*, UseProxy = false*/ };
     var client = new HttpClient(handler) { MaxResponseContentBufferSize = Int32.MaxValue };
     try
     {
         var resp = await client.GetAsync(new Uri(url));
         var content = resp.Content.ReadAsStringAsync().Result;
         var auth = ParseContent(content);
         Debug.WriteLine("[" + DateTime.Now + "] Returning AuthResult : " + auth);
         return new AuthResult { Success = auth, Exception = null};
     }
     catch (Exception exception)
     {
         //
         Debug.WriteLine("[" + DateTime.Now + "] Returning error AuthResult : " + exception.Message);
         return new AuthResult { Success = false, Exception = exception }; ;
         }
     }
}

このメソッドは、実際には現在のケースに関係のない api の他のメソッドでラップされています。

public async Task<AuthResult> IsAuthenticated(string login, string password)
{
    Debug.WriteLine("[" + DateTime.Now + "] Starting ISAuthenticationService.IsAuthenticated");
    // ... (cut) ...
    // async
    var authResult = await ISHelpers.GetDataFromServiceAsync(url, login, password);
    Debug.WriteLine("[" + DateTime.Now + "] Ending ISAuthenticationService.IsAuthenticated");
    return authResult;
}

認証は、それぞれの ViewModel コマンドで行われます。

private async void ExecuteAuthenticationCommand()
{
    // Test stub
    //var authService = new Helpers.MockupAuthenticationService();
    var authService = new Helpers.ISAuthenticationService();
    var auth = await authService.IsAuthenticated(Login, Password);
    if (auth.Success)
    {
        MessageBox.Show("Authentication success");
        Messenger.Default.Send<LoginDataItem>(_dataItem);
    }
    else
    {
        MessageBox.Show(auth.Exception.Message, "Incorrect login data");
    }
 }

デバッグ出力:

[27.06.2012 16:54:10] Starting ISAuthenticationService.IsAuthenticated
[27.06.2012 16:54:10] GetDataFromServiceAsync
[27.06.2012 16:54:25] ParseContent in GetDataFromServiceAsync
[27.06.2012 16:54:25] Returning AuthResult : True
[27.06.2012 16:54:25] Ending ISAuthenticationService.IsAuthenticated

HttpClientHandler 設定で UseProxy = false のコメントを外すと、遅延がなくなり、認証に遅延がなくなります。UseProxy のコメントを外さなくても、同じ問題が時々発生します (約 12 回の実行ごとに 1 回の実行)。問題は、それはバグですか、それとも何ですか? サーバー側からデバッグしようとしましたが、ポーリング リクエスト間に違いは見つかりませんでした。前もって感謝します。

4

1 に答える 1

9

これはバグではありません。IE のデフォルト設定では、プロキシを自動検出しようとしますが、これには最大 30 秒かかる場合があります。自動検出を無効にするには、UseProxy を False に設定する必要があります。

実際、設定は IE とはあまり関係がありません。IE がシステムのデフォルト設定を使用 (および設定) しているだけです。HttpClient と WebClient はどちらも、オーバーライドしない限り、システムのデフォルト設定を使用します。

検出速度については、システムの設定に依存します。IE または Chrome で自動プロキシ検出を無効にすると、再起動後の最初のブラウザがはるかに速く開くことに気付くでしょう。これは、プロキシを検出しようとしないためです。プロキシ検出プロセスは、自動プロキシ検出で説明されており、いくつかの手順が含まれます。

  1. 最後に使用したプロキシ構成スクリプトを見つける
  2. DHCP からプロキシを検出する
  3. DNS を使用して WAPD というマシンをルックアップする

手順 2 と 3 は、ネットワーク インフラストラクチャによっては時間がかかり、タイムアウトが発生する場合もあります。

于 2012-06-27T20:21:26.913 に答える