c# – 与SignalR共享ServiceStack ICacheClient
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 与SignalR共享ServiceStack ICacheClient,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2746字,纯文字阅读大概需要4分钟。
内容图文
我正在尝试在ServiceStack OOB ICacheClient和SignalR Hub之间共享缓存中的元素,但是当我尝试在OnDisconnected事件中获取用户会话时,我收到以下错误
Only ASP.NET Requests accessible via Singletons are supported
我在OnConnected事件中访问会话没有问题,到目前为止,这就是我所做的:
public class HubService:Hub
{
private readonly IUserRepository _userRepository;
private readonly ICacheClient _cacheClient;
public HubService(IUserRepository userRepository,ICacheClient cacheClient)
{
_userRepository = userRepository;
_cacheClient = cacheClient;
}
public override System.Threading.Tasks.Task OnConnected()
{
var session = _cacheClient.SessionAs<AuthUserSession>();
//Some Code, but No error here
return base.OnConnected();
}
public override System.Threading.Tasks.Task OnDisconnected()
{
var session = _cacheClient.SessionAs<AuthUserSession>();
return base.OnDisconnected();
}
}
我正在使用简单的注入器,我的ICacheClient注册为singleton:
Container.RegisterSingle<ICacheClient>(()=>new MemoryCacheClient());
问题是如何在SS中将请求注册为单身?我在SignalR事件中缺少什么?
编辑:
我试图在SS中注册请求的原因是因为如果有可能使用容器注册SS IHttpRequest并且由于异常消息将生活方式设置为单例,那么OnDisconnected事件似乎是httpContext和IHttprequest为null
SS代码如下:
public static string GetSessionId(IHttpRequest httpReq = null)
{
if (httpReq == null && HttpContext.Current == null)
throw new NotImplementedException(OnlyAspNet); //message
httpReq = httpReq ?? HttpContext.Current.Request.ToRequest();
return httpReq.GetSessionId();
}
我想要做的是使用ICacheClient存储已连接用户的列表,我只想在用户断开连接时从列表中删除connectionID.
编辑:
好像按照danludwig post
“There is an interesting thing about SignalR… when a client disconnects from a
hub (for example by closing their browser window), it will create a
new instance of the Hub class in order to invoke OnDisconnected().
When this happens, HttpContext.Current is null. So if this Hub has any dependencies that are >registered per-web-request, something will probably go wrong.”
上面的描述完全符合我的情况
解决方法:
我不是SingalR专家,但根据我的经验和简单的注入器,我不认为你可以在OnDisconnected期间获得Session(或者Request或HttpContext).如果你考虑它就有意义了 – 当客户端断开与集线器的连接时,SignalR不再能够访问会话ID,没有请求,也没有与客户端的通信. OnDisconnected基本上告诉你“在这里,用这个ConnectionId做一些事情,因为它所属的客户端已经消失了.”当然,用户可以回来,然后在OnReconnected期间,您可以访问Web好东西(会话,请求等,只要您是IIS托管的).
我遇到类似的问题,在这3个Hub连接事件期间获得一些simpleinjector依赖项以具有正确的生命周期范围.我想在每个http请求中注册1个依赖项,除了OnDisconnected之外,它还适用于所有内容.因此,我必须尽可能使用SI容器来使用http请求,但在OnDisconnected事件期间需要依赖时使用新的生命周期范围.如果你想读它,我有一个here的帖子描述了我的经历.祝好运.
内容总结
以上是互联网集市为您收集整理的c# – 与SignalR共享ServiceStack ICacheClient全部内容,希望文章能够帮你解决c# – 与SignalR共享ServiceStack ICacheClient所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。