У меня много кода, который зависит от 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;
}
}
}
}
И в мастер-хабе (каждый другой хаб наследует от него):
public abstract class MainHub : Hub
{
public override Task OnConnected()
{
UnifiedHttpContext.SetSignalRContext(Context);
Groups.Add(Context.ConnectionId, UnifiedHttpContext.UserId.ToString());
return base.OnConnected();
}
}
-
Является ли этот правильный подход, или это так или иначе решено, что я не знаю?
-
Является ли это опасным, поскольку статические классы совместно используются в приложении, будет ли этот набор одинаковым контекстом для всех пользователей? Если это так, я могу сделать это по запросу?