C# Winrt/WP8.1中长轮询请求的巨大延迟

C# Winrt/WP8.1中长轮询请求的巨大延迟,c#,windows-runtime,windows-phone-8.1,httpclient,long-polling,C#,Windows Runtime,Windows Phone 8.1,Httpclient,Long Polling,我正在为Windows 8.1和Windows Phone 8.1编写通用应用程序。我需要打开长轮询请求以获得不断更新的数据流。我使用HttpClient完成这项工作,它的工作很好,除了从流中获取新数据的巨大延迟。在WinRT上延迟约10-20秒,在Windows Phone上延迟约1-2分钟(!!!)。这对于这个应用程序来说是不可接受的,我希望我的代码有问题,有人可以帮助我修复它。这是我的密码: var handler = new HttpClientHandler(); using (var

我正在为Windows 8.1和Windows Phone 8.1编写通用应用程序。我需要打开长轮询请求以获得不断更新的数据流。我使用
HttpClient
完成这项工作,它的工作很好,除了从流中获取新数据的巨大延迟。在WinRT上延迟约10-20秒,在Windows Phone上延迟约1-2分钟(!!!)。这对于这个应用程序来说是不可接受的,我希望我的代码有问题,有人可以帮助我修复它。这是我的密码:

var handler = new HttpClientHandler();
using (var client = new HttpClient(handler))
{
      client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
      client.BaseAddress = new Uri("https://my.site.com/");
      handler.CookieContainer.SetCookies(client.BaseAddress, cookies);

      var link = "my/link";
      using (var tokenRequestMessage = new HttpRequestMessage(HttpMethod.Get, link))
      {
           tokenRequestMessage.Headers.Add("Authorization", token);
           tokenRequestMessage.Headers.Add("Foo", "Foo");
           tokenRequestMessage.Headers.Add("Foo1", "Foo2");
           var t = await client.SendAsync(tokenRequestMessage, HttpCompletionOption.ResponseHeadersRead);

           using (var httpResponse = t.Content)
           {
                using (var v = await httpResponse.ReadAsStreamAsync())
                {
                    using (var reader = new StreamReader(v))
                    {
                        while (!reader.EndOfStream)
                        {
                            Debug.WriteLine(reader.ReadLine());
                        }
                    }
                }
           }
     }
}

好吧,以下是我完成任务的方式。它的工作并不完美,但当它出现在
InputStream
中时,我会立即获取数据

var uri = new Uri("www.example.com");
using (var client = new Windows.Web.Http.HttpClient())
{
  client.DefaultRequestHeaders.Cookie.ParseAdd(this.sessionCookies);
  client.DefaultRequestHeaders.Add("header", "value");

  var response = await client.GetAsync(uri, Windows.Web.Http.HttpCompletionOption.ResponseHeadersRead);
  var inputStream = await response.Content.ReadAsInputStreamAsync();
  IBuffer buffer = new Buffer(10000);

  do
  {
       buffer = await inputStream.ReadAsync(buffer, buffer.Capacity, InputStreamOptions.ReadAhead);
       var data = Encoding.UTF8.GetString(buffer.ToArray(), 0, (int) buffer.Length);
       Debug.WriteLine(data);                        
   } while (buffer.Length > 0);
}

好吧,以下是我完成任务的方式。它的工作并不完美,但当它出现在
InputStream
中时,我会立即获取数据

var uri = new Uri("www.example.com");
using (var client = new Windows.Web.Http.HttpClient())
{
  client.DefaultRequestHeaders.Cookie.ParseAdd(this.sessionCookies);
  client.DefaultRequestHeaders.Add("header", "value");

  var response = await client.GetAsync(uri, Windows.Web.Http.HttpCompletionOption.ResponseHeadersRead);
  var inputStream = await response.Content.ReadAsInputStreamAsync();
  IBuffer buffer = new Buffer(10000);

  do
  {
       buffer = await inputStream.ReadAsync(buffer, buffer.Capacity, InputStreamOptions.ReadAhead);
       var data = Encoding.UTF8.GetString(buffer.ToArray(), 0, (int) buffer.Length);
       Debug.WriteLine(data);                        
   } while (buffer.Length > 0);
}

您是如何确定造成延迟的不是服务器的?@usr这是谷歌的服务,它在其他应用程序中工作正常Windows Phone在HTTP管道上按默认值激活了缓冲。如果它干扰了长时间的投票,我不会感到惊讶。问题是,我知道在使用
HttpWebRequest
(请参阅)时如何禁用它,但我不确定
HttpClient
。@kookiz如何正确使用
HttpWebRequest
?我只是想做一些类似的事情,但请求没有得到响应。请求在服务器上运行正常,并且运行正常(根据Fiddler会话)。@RenDishen您在没有Fiddler的情况下尝试过吗?如果证书不受信任,则Windows Phone上的请求将失败。如果您使用Fiddler,请确保在手机(或模拟器)上安装Fiddler根证书。您如何确保不是服务器导致延迟?@usr这是google的服务,在其他应用程序中工作正常Windows phone在HTTP管道上默认激活了缓冲。如果它干扰了长时间的投票,我不会感到惊讶。问题是,我知道在使用
HttpWebRequest
(请参阅)时如何禁用它,但我不确定
HttpClient
。@kookiz如何正确使用
HttpWebRequest
?我只是想做一些类似的事情,但请求没有得到响应。请求在服务器上运行正常,并且运行正常(根据Fiddler会话)。@RenDishen您在没有Fiddler的情况下尝试过吗?如果证书不受信任,则Windows Phone上的请求将失败。如果使用Fiddler,请确保在手机(或模拟器)上安装Fiddler根证书