我正在尝试使用ServerEvents设置servicestack。
我添加了ServerEventsFeature插件。
我正在使用Javascript server events client,并且在用户通过身份验证之后,通过在客户端上执行此操作尝试了一个简单的示例。

  var source = new EventSource('http://localhost/ecmapi/event-stream?channel=MyChannel');
  $(source).handleServerEvents({
           handlers: {
                  onConnect: function (subscription) {
                       console.log("connected! welcome " + subscription.displayName);
                  },
                  onHeartbeat: function (msg, e) {
                      //console.log("onHeartbeat", msg, e);
                       },
                  showNotification: function (type, e) {
                        console.log("showNotification", type);
                        }
                  }
           });


在apphost文件上:

            Plugins.Add(new ServerEventsFeature
                   {
                       StreamPath = "/event-stream",
                       HeartbeatPath = "/event-heartbeat",
                       UnRegisterPath = "/event-unregister",
                       SubscribersPath = null,
                       LimitToAuthenticatedUsers = false,
                       NotifyChannelOfSubscriptions = false
                   });


要将事件发送给客户,我正在致电:

ServerEvents.NotifyChannel("MyChannel", "cmd.showNotification", message);


并且我在客户端的showNotification函数上成功收到了它。

但是,subscription.displayName是自动生成的,并且与当前登录的用户无关。另外,如果将LimitToAuthenticatedUsers设置为true,则将引发401错误。

我的问题是,还需要什么才能使javascript服务器事件客户端可以与已经登录的用户一起使用?我将要改用ServerEvents.NotifyUserName或ServerEvents.NotifyUserId函数,并且还只允许经过身份验证的用户订阅。

谢谢!

**所请求的auth和EventSource的请求和响应头**

要求验证

POST http://localhost/ECMAPI/auth.json
HTTP / 1.1
接受:/
内容类型:application / json
X-Requested-With:XMLHttpRequest
引荐来源:http://localhost/InterfaceGov/Default.aspx
接受语言:en-gb
接受编码:gzip,放气
用户代理:Mozilla / 5.0(兼容; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0)
主机:localhost
内容长度:43
连接:保持活动
语法:无缓存
Cookie:_ga = GA1.1.2077781525.1452005918; , ss-pid = hMBothYg2ETWObMTMJDY; ss-id = x9zxOTH2rFxLo8tO01Nw

响应授权

HTTP / 1.1 200 OK
缓存控制:私有
内容类型:application / json;字符集= utf-8
变化:接受
伺服器:Microsoft-IIS / 7.5
X-Powered-By:ServiceStack / 4.038 Win32NT / .NET
访问控制允许来源:*
访问控制允许方法:GET,POST,PUT,DELETE,OPTIONS
访问控制允许标题:内容类型,授权
X-AspNet版本:4.0.30319
Set-Cookie:ss-pid = QjEKGQphtPJZjZJmPtCt; expires = Sun,2036年5月11日至12:18:29 GMT;路径= /; HttpOnly
Set-Cookie:ss-id = 1yKLtkiTD2NshpiPrffu;路径= /; HttpOnly
X-MiniProfiler-Ids:[“ 1d0459ec1fad4695ac0f3c7fc69cad0a”,“ 3f5cd3515e084363b86df1e54633a683”,“ 0f54d87508594cba9757660dc664aeef”]
X-Powered-by:ASP.NET
日期:格林尼治标准时间2016年5月11日星期三12:18:30
内容长度:17514

请求EventSource

GET http://localhost/ecmapi/event-stream?channel=MyChannel HTTP / 1.1
接受:/
来源:http://localhost
接受语言:en-GB
接受编码:gzip,放气
用户代理:Mozilla / 5.0(兼容; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0)
主机:localhost
连接:保持活动
语法:无缓存

响应事件源

HTTP / 1.1 401未经授权
缓存控制:私有
变化:接受
伺服器:Microsoft-IIS / 7.5
WWW-Authenticate:凭证领域=“ / auth / credentials”
X-Powered-By:ServiceStack / 4.038 Win32NT / .NET
访问控制允许来源:*
访问控制允许方法:GET,POST,PUT,DELETE,OPTIONS
访问控制允许标题:内容类型,授权
X-AspNet版本:4.0.30319
Set-Cookie:ss-pid = c0UQXy4YJNQmVuUiEVfA; expires = Sun,2036年5月11日至12:18:30 GMT;路径= /; HttpOnly
Set-Cookie:ss-id = y9e8BbD1na5EoHu8GUug;路径= /; HttpOnly
X-MiniProfiler-Ids:[“ 1d0459ec1fad4695ac0f3c7fc69cad0a”,“ 3f5cd3515e084363b86df1e54633a683”,“ 0f54d87508594cba9757660dc664aeef”,“ f1584abd58e64a9dac6ceceaa932”
X-Powered-by:ASP.NET
日期:格林尼治标准时间2016年5月11日星期三12:18:30
内容长度:0

最佳答案

/event-stream返回401 Unauthorized的原因是,您对/event-stream的请求不包含必要的会话Cookie,而会话Cookie可以建立身份验证请求。

这只是IE中的一个问题,因为它是最后一个没有native support for Server Sent Events的浏览器,并且需要SSE填充程序才能工作,其局限之一是它不发送会话Cookie。

default_ieshim.cshtml实时演示中的http://chat.servicestack.net/default_ieshim通过将ss-id sessionId附加到事件流URL中来显示如何支持IE中的身份验证请求,该事件流URL可在Razor页面中填充:

var source = new EventSource(
  '/event-stream?channels=@channels&ss-id=@(base.GetSession().Id)&t='
  + new Date().getTime());


您还需要告诉ServiceStack在Url中接受会话ID,您可以在AppHost的Configure()中执行以下操作:

SetConfig(new HostConfig {
    AllowSessionIdsInHttpParams = true,
});

关于javascript - ServiceStack JavaScript服务器事件客户端的身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37132729/

10-16 13:40