我正在尝试使用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/