我想分享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請求的依賴項,出錯。」
以上的完美匹配我的情況
我不認爲簡單注射器的註冊與其他任何容器相比有很大不同,所以如果任何人都可以爲不同的容器回答這個問題,請做。我將用Simple Injector詳細信息(和upvote)更新該答案。不幸的是,我目前無法回答這個問題,因爲我不知道「註冊請求」意味着什麼。 – Steven