在WinRT的HttpClient类中使用Keep-Alive连接?

5
我们的WinRT应用在连接到服务器时非常慢。请求需要大约500毫秒才能完成,这导致我们的一些场景受阻。
调试时我们发现,当Fiddler处于活动状态时,请求速度要快得多-每个请求仅需大约100毫秒。通过一些搜索,我们了解到这是因为Fiddler在代理调用时使用keep-alive连接,这使我们的代理调用更快。
我们用两种方法进行了双重检查:
1.将UseProxy设置为false,观察到请求再次变慢。 2.关闭Fiddler的"重用连接"选项,观察到请求再次变慢。
我们尝试通过Connection标头启用keep-alive(.Connection.Add("Keep-Alive")),但似乎没有任何效果-实际上,该标头似乎被.NET组件无情地忽略并且没有被发送到请求中(通过Fiddler检查)。
有没有人知道如何在Windows 8、WinRT、HttpClient类中设置keep-alive请求?

我能找到的最好的是: http://stackoverflow.com/questions/14099812/httpclient-exception-in-windows-8-app还有一些你可能感兴趣的阅读材料: http://msdn.microsoft.com/en-us/library/system.net.http.headers.httprequestheaders.aspx你是否使用HTTP v. 1.1?在这种情况下,Keep-Alive应该默认为true。 - Kris Selbekk
是的,使用1.1版本。感谢提供的链接,但我不明白第一个链接如何适用于我们 - 我们没有出现错误。至于第二个链接 - 我在问题中指定了我们尝试使用连接头 - 我不确定完整的头列表如何有帮助(抱歉)。 - Shahar Prish
呵呵,我知道啦,但是你永远不知道重新审视一件事情会带来什么惊喜 :-) 祝你好运! - Kris Selbekk
2个回答

10
以下设置了正确的标头以为我打开keep-alive(客户端是HttpClient)
client.DefaultRequestHeaders.Connection.Clear();
client.DefaultRequestHeaders.ConnectionClose = false;
// The next line isn't needed in HTTP/1.1
client.DefaultRequestHeaders.Connection.Add("Keep-Alive");

如果您想关闭keep-alive,请使用以下方法:
client.DefaultRequestHeaders.Connection.Clear();
client.DefaultRequestHeaders.ConnectionClose = true;

1
尝试使用HttpContent类添加标头 - 像这样基于(但未经测试)http://social.msdn.microsoft.com/Forums/en-CA/winappswithcsharp/thread/ce2563d1-cd96-4380-ad41-6b0257164130
在幕后,HttpClient使用HttpWebRequest,这将直接让您访问KeepAlive,但由于您正在通过HttpClient进行操作,因此无法直接访问HttpWebRequest类上的该属性。 public static async Task KeepAliveRequest() { var handler = new HttpClientHandler(); var client = new HttpClient(handler as HttpMessageHandler);
HttpContent content = new StringContent(post data here if doing a post); content.Headers.Add("Keep-Alive", "true");
//choose your type depending what you are sending to the server content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
HttpResponseMessage response = await client.PostAsync(url, content);
Stream stream = await response.Content.ReadAsStreamAsync();
return new StreamReader(stream).ReadToEnd(); }

编辑 由于您只需要GET,您可以使用以下代码:


public static async Task KeepAliveRequest(string url)
{
    var client = new HttpClient();
    var request = new HttpRequestMessage()
    {
        RequestUri = new Uri("http://www.bing.com"),
        Method = HttpMethod.Get,
    };
    request.Headers.Add("Connection", new string[] { "Keep-Alive" });
    var responseMessage = await client.SendAsync(request);
    return await responseMessage.Content.ReadAsStringAsync();
}



感谢你的回答,Adam...
  1. 我们不是在使用POST,而是在使用GET,并且服务器进行验证,所以我们无法切换到POST。
  2. 为什么要在HttpClientHandler上使用"as HttpMessageHandler"?HttpClientHandler本身就是一个HttpMessageHandler。
- Shahar Prish
我们尝试通过DefaultHeaders和HttpRequestMessage的更改来添加Keep-Alive头。但是我们没有直接在请求对象上尝试过它。我会尝试一下,但由于其他两种方法没有将标头放在请求中,我并不抱有太高的希望。 - Shahar Prish
我在winrt应用程序中测试了上面的GET请求代码,并且我只得到了Connection: Keep-Alive作为唯一的请求头。 “在我的机器上运行良好” :) - Adam Tuliper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接