[英]How do I receive live data from a long lived HTTP connection in C#?
我期待處理結果 長期的HTTP連接,從我與他們發生整合的服務器。 該服務器為我希望處理的每個“事件”返回一行 JSON( \\n
分隔)。
給定分配給變量changeStream
的Stream
實例,該變量表示來自開放 HTTP 連接的字節,這是我正在做的提取示例:
( request
是WebRequest
一個實例,配置為打開與我正在集成的服務器的連接。)
var response = request.GetResponse();
var changeStream = response.GetResponseStream();
var lineByLine = Observable.Using(
() => new StreamReader(changeStream),
(streamReader) => streamReader.ReadLineAsync().ToObservable()
);
lineByLine.Subscribe((string line) =>
{
System.Console.WriteLine($"JSON! ---------=> {line}");
});
使用上面的代碼,最終發生的是我收到服務器發送的第一行,但之后沒有。 既不是來自初始響應的響應,也不是由實時活動生成的新響應。
請注意:此場景不適合切換到 SignalR
盡管這看起來更復雜,但最好使用內置運算符來完成這項工作。
IObservable<string> query =
Observable
.FromAsync(() => request.GetResponseAsync())
.SelectMany(
r => Observable.Using(
() => r,
r2 => Observable.Using(
() => r2.GetResponseStream(),
rs => Observable.Using(
() => new StreamReader(rs),
sr =>
Observable
.Defer(() => Observable.Start(() => sr.ReadLine()))
.Repeat()
.TakeWhile(w => w != null)))));
它未經測試,但應該接近。
您的嘗試只會觀察到一個ReadLineAsync
調用。 相反,您需要返回每一行。 大概是這樣的;
Observable.Create<string>(async o => {
var response = await request.GetResponseAsync();
var changeStream = response.GetResponseStream();
using var streamReader = new StreamReader(changeStream);
while (true)
{
var line = await streamReader.ReadLineAsync();
if (line == null)
break;
o.OnNext(line);
}
o.OnCompleted();
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.