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的空引用完全使我感到自豪,我會看看您的帖子,然後讓您知道它是如何發生的。 –