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

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

问题描述:

我正在为Windows 8.1和Windows Phone 8.1编写通用应用程序。我需要打开长轮询请求来持续更新数据流。我这样做与HttpClient和它的工作正常,除了从流中获取新数据的巨大延迟。在WinRT上这个延迟大约10-20秒,在Windows Phone上大约1-2分钟(!!!)。这是不适合这个应用程序,我希望我的代码有问题,有人可以帮我解决它。这里是我的代码:Winrt/WP8.1中的长轮询请求中的巨大延迟

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()); 
         } 
        } 
       } 
      } 
    } 
} 
+0

你是如何确定它不是导致延迟的服务器? – usr

+0

@usr这是谷歌的服务,并在其他应用程序中正常工作 – RenDishen

+0

Windows Phone在HTTP管道上默认启用缓冲。如果它干扰了长期投票,我不会感到惊讶。事情是,我知道如何在使用'HttpWebRequest'时禁用它(请参阅https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.allowreadstreambuffering%28v=vs.95%29 .aspx),但我不确定'HttpClient' ... –

那么,这里是我如何完成我的任务的方式。它的工作原理并不完美,但是当它出现在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); 
}