在WinRT中/ Win8的多个HTTP请求(Multiple HTTP Requests in W

2019-09-22 17:37发布

是否有可能在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。 提琴手做一些有趣的事情,它可以让所有这些连接经过。 我不知道该怎么也不知道为什么。 你可以自己进行测试。 如果你运行上面小提琴手开放,那么成功的代码。

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

Answer 1:

使用我还没有尝试过WebClient中的WinRT API,我只用了HttpClient API(这我使用相当广泛地在我的应用程序)。

此代码的工作:

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对象,并采取他们的结果。



文章来源: Multiple HTTP Requests in WinRT / Win8