Windows 8 WinRT/Win8中的多个HTTP请求

Windows 8 WinRT/Win8中的多个HTTP请求,windows-8,windows-runtime,Windows 8,Windows Runtime,在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 in

在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
}
受保护的异步覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
常量字符串url=”http://www.bom.gov.au/fwo/IDV60901/IDV60901.94868.json";
常数int迭代=3;
var tasks=新列表();
var ticks=DateTime.Now.ticks;
对于(var i=0;i
将此代码放在一个空白的MainPage.xaml.cs中,并使用迭代次数值。如果将其设置为2,则它会工作。任何超过这一点的事情都会失败

注意::测试时不要使用Fiddler。Fiddler做了一些有趣的事情,它允许所有这些连接通过。我不知道怎么做,也不知道为什么。你可以自己测试一下。如果您在fiddler打开的情况下运行上述代码,则会成功


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

我没有尝试在WinRT中使用
WebClient
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);

然后,您可以遍历
响应任务
对象并获取它们的结果。

您可以显示您的代码吗?否则很难诊断。:)这不是因为HTTP规范规定,在任何给定时间,客户端最多只能对给定主机发出两个请求吗?@DominicHopton:这不是浏览器的问题吗?为什么WinRT会阻止我连接两次以上?此外,所有平台都允许您发出多个请求,但它们在内部管理队列。一次只能执行两次,但WinRT只是将您的请求扔掉。@ZombieSheep-我的代码还有很多其他的部分。把它复制/粘贴到这里会很乱。我将尝试创建一个小版本:)谢谢@Slace。我希望有一个解决方案,我可以继续使用WebRequest。我有一些可重用代码放在可移植库中,而HttpClient不可用。我注意到使用HttpClient时,它会丢弃随响应一起发送的自定义头。如果您能提供帮助,请查看此帖子:
var responseTasks = tasks.Select(task => task.Result.Content.ReadAsStringAsync());

await Task.WhenAll(responseTasks);