【问题标题】:Multiple HTTP Requests in WinRT / Win8WinRT / Win8 中的多个 HTTP 请求
【发布时间】:2012-09-21 07:18:43
【问题描述】:

是否可以在 WinRT 中同时发送两个以上的 HTTP 请求?我正在尝试从服务器加载多个 JSON 文档,而 HttpWebRequest 在第二次调用后无法响应。这是一个示例 sn-p 说明了这一点:

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 打开的情况下运行上面的代码,那就成功了。

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

【问题讨论】:

  • 您能出示您的代码吗?否则很难诊断。 :)
  • 这不是因为 HTTP 规范规定,在任何给定时间,客户端最多只能对给定主机进行两个请求?
  • @DominicHopton:这不是浏览器问题吗?为什么 WinRT 会阻止我连接两次以上?此外,所有平台都允许您发出多个请求,但它们在内部管理队列。一次只能执行 2 个,但 WinRT 只是将您的请求丢弃。
  • @ZombieSheep - 我的代码还有很多其他内容。在这里复制/粘贴会很麻烦。我会尝试创建它的一个小版本:)

标签: windows-8 windows-runtime


【解决方案1】:

我没有尝试在 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);

虽然你需要像这样异步读取所有响应,但取出响应正文有点乏味:

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

await Task.WhenAll(responseTasks);

然后您可以遍历 responseTask 对象并获取它们的结果。

【讨论】:

  • 谢谢@Slace。我希望有一个可以继续使用 WebRequest 的解决方案。我有一些可重用的代码位于 HttpClient 不可用的便携式库中。我得把它拆开一点才能让它工作。
  • 我注意到使用 HttpClient 时,它会丢弃随响应发送的自定义标头。如果您可以提供帮助,请查看此帖子:stackoverflow.com/questions/12578022/…
猜你喜欢
  • 2019-06-08
  • 2016-03-29
  • 2016-12-15
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多