5

打开与我们服务器的连接时,我们的 WinRT 应用程序非常慢。请求需要大约 500 毫秒才能运行。这阻碍了我们的一些场景。

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

我们以两种方式仔细检查了这一点。

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

我们尝试通过 Connection 标头 (.Connection.Add("Keep-Alive")) 启用 keep-alive,但这似乎没有任何效果 - 事实上,标头似乎被 .NET 组件公然忽略并且是未按请求发送(再次通过 Fiddler 检查)。

有谁知道如何在 Windows 8、WinRT、HttpClient 类中设置保持活动状态?

4

2 回答 2

9

以下设置正确的标头为我打开保持活动状态(客户端是 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");

如果要关闭保持活动状态,请使用

client.DefaultRequestHeaders.Connection.Clear();
client.DefaultRequestHeaders.ConnectionClose = true;
于 2016-11-18T02:26:14.440 回答
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();
}


于 2013-03-05T06:39:20.560 回答