首页 > 解决方案 > 使用SignalR时如何访问hangfire中的Session(IDashboardAuthorizationFilter的实现中的Authrize方法)?

问题描述

我正在使用 hangfire 并且出于授权目的,我试图在 Authorize([NotNull] DashboardContext context) 方法中访问为空的会话值。请注意,这个问题是在我将 SignalR 合并到我的应用程序中之后遇到的。

如果我删除“app.MapSignalR();” 来自startup.cs的行,我能够成功访问会话

public void Configuration(IAppBuilder app)
{
...
app.MapSignalR(); //if I remove this line, session is accessible
...
}

public class MyRestrictiveAuthorizationFilter : IDashboardAuthorizationFilter{

public bool Authorize([NotNull] DashboardContext context)
{

 HttpSessionStateBase session = ((System.Web.HttpContextWrapper)(owinEnvironment["System.Web.HttpContextBase"])).Session; //Which is null

 session = HttpContext.Current.Session; //Also Null
 }
}

请注意,我在 startup.cs 的 Configuration 方法中引入“app.MapSignalR()”后,会话值为 null

标签: c#asp.netsessionhangfire

解决方案


根据 ASP.Net Core Docs,获取会话的空值是正常行为。

SignalR 应用程序不支持会话,因为 SignalR 集线器可能独立于 HTTP 上下文执行。例如,当一个长轮询请求在请求的 HTTP 上下文的生命周期之后被集线器保持打开状态时,就会发生这种情况。

SignalR 和会话状态 SignalR 应用程序不应使用会话状态来存储信息。SignalR 应用程序可以将每个连接状态存储在集线器的 Context.Items 中。

文档


推荐阅读