4

我想分享ServiceStack OOB ICacheClient和SignalR集线器之间的高速缓存中的元素,但我发现了以下错误,当我尝试在OnDisconnected事件,以获取用户会话共享ServiceStack ICacheClient与SignalR

只有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被注册为单:

Container.RegisterSingle<ICacheClient>(()=>new MemoryCacheClient()); 

的问题是我怎么注册请求在SS单身?我在SignalR事件上错过了什么?

编辑:

什么我试图expain为注册请求在SS是因为如果有使用容器注册SS IHttpRequest并设置生活方式单的可能性,由于异常消息,它好像HttpContext的和IHttprequest都为空由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

像“有一个关于SignalR一件有趣的事情......当来自 集线器的客户端断开连接(例如,通过关闭浏览器窗口),它将创建一个 Hub类的新实例,以便调用OnDisconnected() 发生这种情况时,HttpContext.Current为null,因此如果此Hub具有任何>注册每个Web请求的依赖项,出错。”

以上的完美匹配我的情况

+0

我不认为简单注射器的注册与其他任何容器相比有很大不同,所以如果任何人都可以为不同的容器回答这个问题,请做。我将用Simple Injector详细信息(和upvote)更新该答案。不幸的是,我目前无法回答这个问题,因为我不知道“注册请求”意味着什么。 – Steven

回答

4

我不是SingalR专家,但根据我与它简单的喷油器的经验,我不认为你可以在会话(或请求,HttpContext的取得说明在OnDisconnected期间)。如果你考虑这个问题的话,这种方法是有道理的 - 当一个客户端从集线器上断开时,SignalR不再有权访问会话ID,也没有请求,就没有与客户端进行更多的通信。 OnDisconnected基本上告诉你“在这里,用这个ConnectionId做一些事情,因为它所属的客户端已经消失了。”授予用户可以回来,然后在OnReconnected期间,您可以访问Web好东西(会话,请求等,只要您是IIS托管的)。

我有类似的问题,使得一些simpleinjector依赖性在这3个Hub连接事件中拥有正确的生命周期范围。有一个依赖关系,我想要注册每个http请求,并且它适用于除OnDisconnected之外的所有内容。所以我不得不在Siebel容器上使用http请求,但在OnDisconnected事件期间需要依赖关系时使用新的生命周期范围。如果你喜欢阅读它,我有一个文章here描述我的经验。祝你好运。

+0

感谢您的回答,因为IHttpRequest的空引用完全使我感到自豪,我会看看您的帖子,然后让您知道它是如何发生的。 –