servicestack,C#,servicestack" /> servicestack,C#,servicestack" />

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

C# ServiceEventsClient仅接收最后一行事件数据,c#,servicestack,C#,servicestack,我们有一个SSE服务器推送以下事件: ... event: event_id data: AQAAAAAAKTUMAQAAAWuY4NWAAAAAAAAAAwcAAD9IAAAAAAApNQ0BAAABa5jlaWAAAAAAAAADAQAA data: PVQAAAAAACk1DgEAAAFrmOVpYAAAAAAAAAMDAAA/SAAAAAAAKTUPAQAAAWuY5WlgAAAAAAAAAwUA data: AEE8AAAAAAApNRABAAABa5jlaWAAAAAAAAADBwA

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

    听起来您使用的是自定义SSE服务器,而不是ServiceStack设计用于工作的实现,它依赖于多种意见,如调用周期性心跳端点、订阅/取消订阅端点以及每个SSE帧仅一个
    数据
    有效负载,而不是示例中显示的多个


    基本上,如果您不使用ServiceStack服务器事件实现,您将在使用ServiceStack服务器事件客户端时遇到互操作性问题,您应该使用一个更通用、更非专用的SSE客户端实现。

    听起来您使用的是自定义SSE服务器,而不是ServiceStack的设计依赖于许多观点,如调用周期性心跳端点、订阅/取消订阅端点以及每个SSE帧只有一个
    数据
    有效负载,而不是示例中显示的多个有效负载


    基本上,如果您不使用ServiceStack服务器事件实现,您将在使用ServiceStack服务器事件客户端时遇到互操作性问题,您应该改用更通用、更非专用的SSE客户端实现。

    谢谢您的回答。对于重新连接的问题,如果发生重新连接,我们可以更改EventStreamPath吗?@KezhenXi我不理解重新连接的相关性,但请看一看哪一个允许您修改客户端用于建立SSE连接的EventStreamUri,它可能会满足您的需要。ResolveStreamUrl和EventStreamPath工作正常。谢谢你。关于OneException回调还有一个问题,它是否仅适用于ServiceStack服务器事件?当客户端
    start()
    之后出现网络问题时,我们无法捕获任何错误。然后没有新消息出现。@KezhenXi当HTTP请求在建立SSE连接、处理心跳或数据响应时出错时,
    OneException
    回调将被触发。根据我的回答,ServiceStack的服务器事件客户端应仅用于消费ServiceStack服务器事件。感谢您的回答。对于重新连接的问题,如果发生重新连接,我们可以更改EventStreamPath吗?@KezhenXi我不理解重新连接的相关性,但请看一看哪一个允许您修改客户端用于建立SSE连接的EventStreamUri,它可能会满足您的需要。ResolveStreamUrl和EventStreamPath工作正常。谢谢你。关于OneException回调还有一个问题,它是否仅适用于ServiceStack服务器事件?当客户端
    start()
    之后出现网络问题时,我们无法捕获任何错误。然后没有新消息出现。@KezhenXi当HTTP请求在建立SSE连接、处理心跳或数据响应时出错时,
    OneException
    回调将被触发。根据我的回答,ServiceStack的服务器事件客户端应仅用于消费ServiceStack服务器事件。