14

ASP.NET MVC4アプリケーションには、いくつかの外部Webサイトにアクセスして、ページに表示する情報を集約して収集するコントローラーアクションがあります。明らかに、これを並行して実行したいので、次のようなコードを記述しました。

var client1 = new HttpClient().GetAsync("http://google.com");
var client2 = new HttpClient().GetAsync("http://stackoverflow.com");
var client3 = new HttpClient().GetAsync("http://twitter.com");

var result1 = client1.Result;
var result2 = client2.Result;
var result3 = client3.Result;

各リクエストが完了するまでにかかった時間を確認して、その情報を自分のページに表示するにはどうすればよいですか?

4

2 に答える 2

17

私はおそらく次のようなものを試してみます:

private async void _HttpServerDemo()
{
    var info1 = _GetHttpWithTimingInfo("http://google.com");
    var info2 = _GetHttpWithTimingInfo("http://stackoverflow.com");
    var info3 = _GetHttpWithTimingInfo("http://twitter.com");

    await Task.WhenAll(info1, info2, info3);
    Console.WriteLine("Request1 took {0}", info1.Result);
    Console.WriteLine("Request2 took {0}", info2.Result);
    Console.WriteLine("Request3 took {0}", info3.Result);
}

private async Task<Tuple<HttpResponseMessage, TimeSpan>> _GetHttpWithTimingInfo(string url)
{
    var stopWatch = Stopwatch.StartNew();
    using (var client = new HttpClient())
    {
        var result = await client.GetAsync(url);
        return new Tuple<HttpResponseMessage, TimeSpan>(result, stopWatch.Elapsed);
    }
}
于 2013-01-05T23:58:19.700 に答える
2

現在、.NET Coreには1つのオプションがあり、より良い結果が得られる可能性があります。少なくとも私の場合、経過時間は@ollifantによって提案された方法を使用するよりも約10〜40%短くなります。私は彼の提案にとどまりますが、ストップウォッチをハンドラーに移動しました。

DelegatingHandler、例:.NETCoreDocsを使用できます。

上記のようにストップウォッチを使用することもできますが、ハンドラー自体で使用することもできます。経過時間をヘッダーに追加し、それを取得して、たとえば_GetHttpWithTimingInfoに追加し、さらに処理します。プロジェクトによっては、一部のサービスをDIして、ハンドラー自体からデータベースに期間を保存できる可能性があります。

たぶん、この解決策は@DmytroBogatovによって言及された問題も解決するかもしれません。

また、このメソッドは、 .NETCoreHTTPロギングチェックSendAsyncで直接使用されます。Stopwatchの代わりに内部ValueStopwatchを使用していることに注意してください。

これらのログは、ハンドラーでストップウォッチを使用しているのに対し、メソッドで直接使用していることを示しています。

08-11-2020 18:05:52.024 [INF] Handler: 992, _GetHttpWithTimingInfo 995
08-11-2020 18:05:52.153 [INF] Handler: 663, _GetHttpWithTimingInfo 1249
08-11-2020 18:05:52.208 [INF] Handler: 999, _GetHttpWithTimingInfo 1220
08-11-2020 18:05:52.219 [INF] Handler: 1002, _GetHttpWithTimingInfo 1241
08-11-2020 18:05:52.219 [INF] Handler: 989, _GetHttpWithTimingInfo 1217
08-11-2020 18:05:52.255 [INF] Handler: 609, _GetHttpWithTimingInfo 1302
08-11-2020 18:05:52.260 [INF] Handler: 959, _GetHttpWithTimingInfo 1267
08-11-2020 18:05:52.287 [INF] Handler: 1063, _GetHttpWithTimingInfo 1303
08-11-2020 18:05:52.292 [INF] Handler: 515, _GetHttpWithTimingInfo 1381
08-11-2020 18:05:52.296 [INF] Handler: 992, _GetHttpWithTimingInfo 1286
08-11-2020 18:05:52.321 [INF] Handler: 953, _GetHttpWithTimingInfo 1323
08-11-2020 18:05:52.324 [INF] Handler: 973, _GetHttpWithTimingInfo 1304
08-11-2020 18:05:52.326 [INF] Handler: 985, _GetHttpWithTimingInfo 1302
于 2020-11-08T17:33:09.393 に答える