我有很多依赖于 HttpContext.Current 的代码,
我注意到来自 SignalR 集线器的请求HttpContext.Current == null
,
所以我的代码中断了,例如:
HttpContext.Current.Request.IsAuthenticated
所以我想出了以下几点:
public static class UnifiedHttpContext
{
private static HubCallerContext SignalRContext { get; set; }
private static int SignalRUserId
{
get { return WebSecurity.GetUserId(SignalRContext.User.Identity.Name); }
}
private static bool IsSignalRRequest
{
get { return SignalRContext != null; }
}
public static void SetSignalRContext(HubCallerContext context)
{
SignalRContext = context;
}
public static bool IsAuthenticated
{
get
{
if (!IsSignalRRequest)
{
return System.Web.HttpContext.Current.Request.IsAuthenticated;
}
else
{
return SignalRContext.User.Identity.IsAuthenticated;
}
}
}
public static int UserId
{
get
{
if (!IsSignalRRequest)
{
return WebSecurity.CurrentUserId;
}
else
{
return SignalRUserId;
}
}
}
}
在 master hub 中(所有其他 hub 都继承自它):
public abstract class MainHub : Hub
{
public override Task OnConnected()
{
UnifiedHttpContext.SetSignalRContext(Context);
Groups.Add(Context.ConnectionId, UnifiedHttpContext.UserId.ToString());
return base.OnConnected();
}
}
SignalR 使您可以访问HubCallerContex
代替HttpContext
。您可以使用关键字访问 HubCallerContext 对象context
。如果您想访问HttpContext
您可以从上下文中获取它,如下所示:
System.Web.HttpContextBase httpContext = Context.Request.GetHttpContext();
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)