ServiceStack OOB ICacheClient と SignalR 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 はシングルトンとして登録されています:
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の投稿 によると
「SignalR には興味深い点があります...クライアントがハブから切断されると (たとえば、ブラウザー ウィンドウを閉じることによって)、OnDisconnected() を呼び出すために Hub クラスの新しいインスタンスが作成されます。これが発生すると、 HttpContext.Current は null です。したがって、このハブに Web リクエストごとに登録される依存関係がある場合、おそらく何か問題が発生するでしょう。」
上記の説明は私の状況と完全に一致しています