支持CORS的服务器发送事件

本文关键字:事件 服务器 CORS 支持 | 更新日期: 2023-09-27 18:29:10

我在ServiceStack中使用服务器发送的事件,我需要允许它跨源使用。

我已经在我的应用程序中设置了ServiceStack CorsFeature,但ServerEventsFeature没有遵守这一点。

我可以在OnCreated中手动添加Access-Control-Allow-Origin标头,这允许向event-stream请求,但向心跳的请求失败,因为我无法在此请求上设置标头。

Plugins.Add(new ServerEventsFeature {
    HeartbeatInterval = new TimeSpan(0,0,30),
    OnCreated = (subscription, request) => {
        request.Response.AddHeader("Access-Control-Allow-Origin","*");
    }
    ...
}

由于SSE功能是在RawHandler上实现的,所以我看不出如何将这个头放入请求中。有没有一种方法可以为所有/event- url设置标题?

谢谢。

支持CORS的服务器发送事件

只有/event-stream/event-heartbeat是原始HTTP处理程序,其他event-*路由是通过ServiceStack的请求管道的普通ServiceStack服务。

我添加了一个更改,以便在此提交中自动将Config.GlobalResponseHeaders应用于/event-stream/event-heartbeat处理程序。当启用CorsFeature时,此更改现在应该会自动添加CORS标头。

我还为/event-heartbeat回调添加了OnHeartbeatInit,以匹配/event-stream OnInit回调,因此您也可以向心跳处理程序添加自定义标头。

Plugins.Add(new ServerEventsFeature {
    HeartbeatInterval = new TimeSpan(0,0,30),
    OnInit = (request) => {
        request.Response.AddHeader(...);
    },
    OnHeartbeatInit = (request) => {
        request.Response.AddHeader(...);
    },
    ...
}

此更改可从v4.0.34+版本获得,该版本现在可在MyGet上获得。