簡體   English   中英

如何從 C# 中長期存在的 HTTP 連接接收實時數據?

[英]How do I receive live data from a long lived HTTP connection in C#?

我期待處理結果 長期的HTTP連接,從我與他們發生整合的服務器。 該服務器為我希望處理的每個“事件”返回一行 JSON( \\n分隔)。

給定分配給變量changeStreamStream實例,該變量表示來自開放 HTTP 連接的字節,這是我正在做的提取示例:

requestWebRequest一個實例,配置為打開與我正在集成的服務器的連接。)

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}");
});

使用上面的代碼,最終發生的是我收到服務器發送的第一行,但之后沒有。 既不是來自初始響應的響應,也不是由實時活動生成的新響應。

  • 就我的問題而言,假設此連接將無限期地保持打開狀態。
  • 我如何讓 system.reactive 在遇到每行時觸發回調?

請注意:此場景不適合切換到 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM