2017-04-20 9 views
0

Http 스트리밍 API에 액세스하기위한 REST 서비스 용 C# 클라이언트를 작성합니다. 나는 스트림을 열고 서버에 의해 끝없이 흐르는 스트림에서 메시지를 받았다. 스트림에서 외부 명령을 읽을 때 중지해야합니다. HttpClient가 구현에 사용됩니다. Variable 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) 

열 (가설) 영원히 스트림을 유지하기 위해 어떤 방법이 있나요?

답변

0

StreamReader를 놓아도된다면 Stream 개체를 직접 열지 않으시겠습니까? 다음은

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 무한정 기다려야하는 유니버설 앱 (사용 Windows.Web의 API)입니다. opperation을 취소해야하는 경우 CancellationToken 접근 방식을 사용하여 Task을 사용할 수 있습니다.