1

是否可以在 WinRT 中同时发送两个以上的 HTTP 请求?我正在尝试从服务器加载多个 JSON 文档,而 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 做了一些有趣的事情,它允许所有这些连接通过。我不知道如何也不知道为什么。你可以自己测试一下。如果您在 fiddler 打开的情况下运行上面的代码,则成功。

注意:: 这不是真正的代码。我只是用这个例子来说明这个问题。

4

1 回答 1

2

我没有尝试WebClient在 WinRT 中使用 API,我只使用了HttpClientAPI(我在我的应用程序中使用得非常广泛)。

此代码有效:

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 回答