gpt4 book ai didi

c# - HttpContext 和 SignalR HubCallerContext 之间的统一静态类

转载 作者:可可西里 更新时间:2023-11-01 07:54:27 24 4
gpt4 key购买 nike

我有很多代码依赖于 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。您可以使用关键字 context 访问 HubCallerContext 对象。如果你想访问 HttpContext,你可以从上下文中获取它,如下所示:

System.Web.HttpContextBase httpContext = Context.Request.GetHttpContext();

希望这对您有所帮助。

关于c# - HttpContext 和 SignalR HubCallerContext 之间的统一静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21659789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com