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

本文关键字:Keep-Alive 连接 winrt HttpClient | 更新日期: 2023-09-27 18:02:27

我们的WinRT应用程序在打开与服务器的连接时非常慢。请求的运行时间约为500ms。这阻塞了我们的一些场景。

在调试时,我们注意到当Fiddler处于活动状态时,请求要快得多-每个请求约100ms。经过一些搜索之后,我们明白了这是因为Fiddler在代理调用时使用Keep-Alive连接,这使得我们的代理调用更快。

我们用两种方法检查了这一点。

  1. 我们设置UseProxy为false,观察到请求又变慢了。
  2. 我们关闭了Fiddler的"重用连接"选项,观察到请求又变慢了。

我们尝试通过连接头(.Connection. add (" keep-alive "))启用keep-alive,但这似乎没有任何效果-事实上,头似乎被。net组件公然忽略,并且没有在请求中发送(再次通过Fiddler检查)。

有没有人知道如何在Windows 8, WinRT, HttpClient类的请求上设置keep-alive ?

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

下面设置了正确的报头来为我打开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;

尝试使用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(); }