ServiceEventsClient仅接收事件数据的最后一行

时间:2019-06-28 00:02:43

标签: c# servicestack

我们有一个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
...

1 个答案:

答案 0 :(得分:0)

听起来您使用的是自定义SSE服务器,而不是ServiceStack's Server Events实现,ServiceStack的Server Event clients设计用于这种实现,它依赖于诸如调用定期心跳终结点,订阅/取消订阅端点,每个SSE帧只有一个data有效负载,而不是示例中显示的多个有效负载。

基本上,如果您不使用ServiceStack Server事件实现,则会因使用ServiceStack Server事件客户端而遇到互操作性问题,而应使用更通用且不受质疑的SSE客户端实现。