2017-04-20 7 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オブジェクトを直接開いてみませんか?以下は、これはawait responseStream.ReadAsyncを無期限に待機しなければならない(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); 
     } 
    } 
} 

ためです。あなたはまだCancellationTokenアプローチでTaskを使用することができますopperationをキャンセルする必要がある場合。

関連する問題