Windows 8 WinRT/Win8中的多个HTTP请求
在WinRT中是否可以同时发送两个以上的HTTP请求?我试图从服务器加载多个JSON文档,第二次调用后HttpWebRequest无法响应。下面是一个示例片段,说明了这一点: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
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);