ServiceEventsClient 只接收最后一行事件数据

ServiceEventsClient only receive the last line of event data

我们有一个 SSE 服务器推送如下事件:

...
event: event_id
data: AQAAAAAAKTUMAQAAAWuY4NWAAAAAAAAAAwcAAD9IAAAAAAApNQ0BAAABa5jlaWAAAAAAAAADAQAA
data: PVQAAAAAACk1DgEAAAFrmOVpYAAAAAAAAAMDAAA/SAAAAAAAKTUPAQAAAWuY5WlgAAAAAAAAAwUA
data: AEE8AAAAAAApNRABAAABa5jlaWAAAAAAAAADBwAAPuQAAAAAACk1EQEAAAFrmOn9QAAAAAAAAAMB
data: AAA88AAAAAAAKTUSAQAAAWuY6f1AAAAAAAAAAwMAAD7kAAAAAAApNRMBAAABa5jp/UAAAAAAAAAD
data: BQAAQNgAAAAAACk1FAEAAAFrmOn9QAAAAAAAAAMHAAA+5AAAAAAAKTUVAQAAAWuY7pEgAAAAAAAA
data: AwEAAD24
...

两个问题:

  1. 我们使用ServerEventClient时,只能收到最后一行事件数据"AwEAAD24"

  2. 如何在客户端获得自动重连时更改 EventStreamPath 查询参数。我们需要发送一个 "from" 参数来从 SSE 服务器查询新数据。否则SSE服务器还是会推送旧数据给客户端

示例代码:

public void testSSE() {
            var client = new ServerEventsClient(SSEServerUri) {
                EventStreamPath = streamUri + queryParam,
                OnConnect = con => Console.WriteLine(con.Data),
                OnHeartbeat = () => Console.WriteLine("heartbeat"),
                OnMessage = e => Console.WriteLine("message data: " + e.data),
                OnException = exp => printerror(exp.Message)
            };
            client.Start();
            Thread.Sleep(Timeout.Infinite);
        }

结果:

...
message data: AwEAAD24
...

听起来您使用的是自定义 SSE 服务器而不是 ServiceStack's Server Events implementation which ServiceStack's Server Event clients每个 SSE 帧一个 data 有效负载,而不是示例中显示的多个有效负载。

基本上,如果您不使用 ServiceStack Server Events 实现,您将 运行 解决使用 ServiceStack Server Event Client 的互操作性问题,您应该改用更通用且不拘一格的 SSE 客户端实现。