1

WinRTで3つ以上のHTTPリクエストを同時に送信することは可能ですか?サーバーから複数のJSONドキュメントを読み込もうとしていますが、2回目の呼び出し後にHttpWebRequestが応答しません。これを示すサンプルスニペットは次のとおりです。

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    const string url = "http://www.bom.gov.au/fwo/IDV60901/IDV60901.94868.json";
    const int iterations = 3;

    var tasks = new List<Task>();
    var ticks = DateTime.Now.Ticks;

    for (var i = 0; i < iterations; i++)
    {
        // Create unique URL by appending a generated number.
        var uniqueUrl = string.Format("{0}?v={1}", url, (i + ticks));

        // Create the request.
        var request = WebRequest.CreateHttp(uniqueUrl);

        // Create the async task and store it for later.
        var task = request.GetResponseAsync();

        tasks.Add(task);
    }

    // Await all tasks in collection.
    await Task.WhenAll(tasks);



    Debugger.Break(); // <----- This will never break when iterations > 2
}

このコードを空白のMainPage.xaml.csに入れて、反復値を試してみてください。2に設定すると、機能します。それ以上のものは失敗します。

::これをテストするときはFiddlerを使用しないでください。Fiddlerは何か面白いことをし、これらすべての接続を通過させます。方法も理由もわかりません。これは自分でテストできます。上記のコードをフィドラーを開いた状態で実行すると、成功します。

::これは実際のコードではありません。この例は、問題を説明するためにのみ使用しています。

4

1 に答える 1

2

WebClient私はWinRT で API を使用しようとはしていません。API のみを使用しましたHttpClient(アプリケーションで非常に広範囲に使用しています)。

このコードは機能します:

const string url = "http://www.bom.gov.au/fwo/IDV60901/IDV60901.94868.json";
const int iterations = 10;

var tasks = new List<Task<HttpResponseMessage>>();
var ticks = DateTime.Now.Ticks;

for (var i = 0; i < iterations; i++)
{
    // Create unique URL by appending a generated number.
    var uniqueUrl = string.Format("{0}?v={1}", url, (i + ticks));

    var handler = new HttpClientHandler();

    var client = new HttpClient(handler)
                        {
                            BaseAddress = new Uri(uniqueUrl)
                        };

    var task = client.GetAsync(client.BaseAddress);

    tasks.Add(task);
}

// Await all tasks in collection.
await Task.WhenAll(tasks);

ただし、次のようにすべての応答を非同期で読み取る必要があるため、応答本文を取得するのは少し面倒です。

var responseTasks = tasks.Select(task => task.Result.Content.ReadAsStringAsync());

await Task.WhenAll(responseTasks);

次に、responseTaskオブジェクトを反復処理して、その結果を得ることができます。

于 2012-09-25T00:49:15.143 に答える