在winrt的HttpClient类中使用Keep-Alive连接
本文关键字:Keep-Alive 连接 winrt HttpClient | 更新日期: 2023-09-27 18:02:27
我们的WinRT应用程序在打开与服务器的连接时非常慢。请求的运行时间约为500ms。这阻塞了我们的一些场景。
在调试时,我们注意到当Fiddler处于活动状态时,请求要快得多-每个请求约100ms。经过一些搜索之后,我们明白了这是因为Fiddler在代理调用时使用Keep-Alive连接,这使得我们的代理调用更快。
我们用两种方法检查了这一点。
- 我们设置UseProxy为false,观察到请求又变慢了。 我们关闭了Fiddler的"重用连接"选项,观察到请求又变慢了。
我们尝试通过连接头(.Connection. add (" keep-alive "))启用keep-alive,但这似乎没有任何效果-事实上,头似乎被。net组件公然忽略,并且没有在请求中发送(再次通过Fiddler检查)。
有没有人知道如何在Windows 8, 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();
}