我们有一个SSE服务器推送如下事件:
...
event: event_id
data: AQAAAAAAKTUMAQAAAWuY4NWAAAAAAAAAAwcAAD9IAAAAAAApNQ0BAAABa5jlaWAAAAAAAAADAQAA
data: PVQAAAAAACk1DgEAAAFrmOVpYAAAAAAAAAMDAAA/SAAAAAAAKTUPAQAAAWuY5WlgAAAAAAAAAwUA
data: AEE8AAAAAAApNRABAAABa5jlaWAAAAAAAAADBwAAPuQAAAAAACk1EQEAAAFrmOn9QAAAAAAAAAMB
data: AAA88AAAAAAAKTUSAQAAAWuY6f1AAAAAAAAAAwMAAD7kAAAAAAApNRMBAAABa5jp/UAAAAAAAAAD
data: BQAAQNgAAAAAACk1FAEAAAFrmOn9QAAAAAAAAAMHAAA+5AAAAAAAKTUVAQAAAWuY7pEgAAAAAAAA
data: AwEAAD24
...
两个问题:
使用ServerEventClient时,我们只能接收事件数据的最后一行“ AwEAAD24”
如何在客户端自动重新连接时更改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
...
答案 0 :(得分:0)
听起来您使用的是自定义SSE服务器,而不是ServiceStack's Server Events实现,ServiceStack的Server Event clients设计用于这种实现,它依赖于诸如调用定期心跳终结点,订阅/取消订阅端点,每个SSE帧只有一个data
有效负载,而不是示例中显示的多个有效负载。
基本上,如果您不使用ServiceStack Server事件实现,则会因使用ServiceStack Server事件客户端而遇到互操作性问题,而应使用更通用且不受质疑的SSE客户端实现。