我试图在servicestack oob icacheclient和signaler hub之间共享缓存中的元素,但是当我试图在ondisconnected事件中获取用户会话时出现以下错误
仅支持通过单例访问的ASP.NET请求
我在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中将请求注册为单例?我在信号器事件上遗漏了什么?
编辑:
我试图在s s中为register请求解释的是,如果有可能使用容器注册ss ihttpprequest,并由于异常消息而将生活方式设置为singleton,则httpcontext和ihttpprequest在ondisconnected事件中似乎为空。
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
“信号员有一件有趣的事……当客户与
集线器(例如通过关闭浏览器窗口),它将创建
hub类的新实例,以便调用ondisconnected()。
发生这种情况时,httpcontext.current为空。因此,如果这个集线器的任何依赖项在每个web请求中都>注册,那么可能会出错。”
上面的描述完全符合我的情况

最佳答案

我不是信号专家,但根据我的经验和简单的注入器,我认为在断开连接的过程中,您无法获得会话(或请求,或是httpcontext)。不过,如果你仔细想想,这是有意义的——当客户机从集线器断开连接时,signaler不再有权访问会话id,没有请求,就不再与客户机通信。ondisconnected基本上是告诉您“在这里,对这个connectionid做点什么,因为它所属的客户机已经离开了。”授予用户可能会回来,然后您可以在onresconnected期间访问web goodies(会话、请求等,只要您是iis宿主)。
在这3个集线器连接事件期间,我遇到了类似的问题,无法使一些SimpleInjector依赖项具有正确的生存期范围。我想为每个http请求注册一个依赖项,它对除了断开连接之外的所有内容都有效。因此,我不得不在可能的情况下使用http请求,但在ondisconnected事件期间需要依赖项时使用新的生存期范围。如果你想看的话,我有一篇描述我经历的文章。祝你好运。

08-07 02:59