在无尽的Http流超时

问题描述:

我正在编写C#客户端REST服务来访问Http流API。我应该打开流,并接收由无尽流的服务器发送的消息。从流中读取的外部命令应停止。 HttpClient用于实现。变量streamingActive用于停止从流中读取,因为reader.EndOfStream永远不会返回值true。在无尽的Http流超时

using (HttpClient httpClient = new HttpClient()) 
{ 
    httpClient.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite); 
    var messagesUri = "http://127.0.0.1:8080/api/messages/progress?sender_id=7837492342"; 
    var stream = httpClient.GetStreamAsync(messagesUri).Result; 

    using (var reader = new StreamReader(stream)) 
    { 
     while (streamingActive && !reader.EndOfStream) 
     { 
      var currentLine = reader.ReadLine(); 
      try 
      { 
       var psMessage = JsonConvert.DeserializeObject<PSMessage>(currentLine); 
       Console.WriteLine(psMessage); 
      } 
      catch (JsonReaderException exc) 
      {} 
     } 
    } 
} 

它工作正常,而有消息来自服务器。如果从服务器没有新的消息〜300秒通话reader.EndOfStream抛出异常“的操作已超时。”

at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
at System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.Read(Byte[] buffer, Int32 offset, Int32 count) 

有什么办法让流开(假设)到永远吗?

如果您愿意放弃StreamReader,为什么不直接打开Stream对象?下面是一个通用的应用程序(使用Windows.Web API)

HttpResponseMessage respMessage; 
//note: client and request is defined elsewhere. 
respMessage = client.SendRequestAsync(request, HttpCompletionOption.ResponseHeadersRead); 
using (var responseStream = await respMessage.Content.ReadAsInputStreamAsync()) 
{ 
    using (var fileWriteStream = await fileToStore.OpenAsync(FileAccessMode.ReadWrite)) 
    { 
     while (streamingActive && (await responseStream.ReadAsync(streamReadBuffer, bufferLength, InputStreamOptions.None)).Length > 0) 
     { 
      await fileWriteStream.WriteAsync(streamReadBuffer); 
     } 
    } 
} 

这应该无限期地等待await responseStream.ReadAsync。如果您仍然需要取消操作,您可以使用TaskCancellationToken方法。