【问题标题】:How can I access HttpContext Header values in Static class如何访问静态类中的 HttpContext 标头值
【发布时间】:2022-01-12 14:10:10
【问题描述】:
我正在编写一个 ASP.NET Core 5.0 Web API。
我有一个像这样的CurrentUser 课程。我想使用CurrentUser.Id 访问项目中任何地方的标题信息。我怎样才能做到这一点? (或者我在哪里可以初始化httpContext 变量?)
public class CurrentUser
{
private static HttpContext _context;
private static UserDto _myUserObj;
public static void Initialize(AuthorizationFilterContext context)
{
_context = context.HttpContext;
_myUserObj = context.HttpContext.Request.Headers["User"] as UserDto;
}
public static int Id()
{
return _myUserObj.Id
}
}
【问题讨论】:
标签:
static
asp.net-core-webapi
httpcontext
【解决方案1】:
我找到了一些解决方案。但我认为这不是最佳实践解决方案。 (必须有另一种更好的方法..)
我的解决方案是:
我正在构建一个自定义属性,并像这样添加每个 API 控制器:
[MyCustomAttribute]
public class UserController : ControllerBase{
//blablabla
}
在此之后:我在这个属性中设置我的 CurrentUser.Initilaze() 方法,如下所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyCustomAttribute: Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
//fortest
var userObj = context.HttpContext.Request.Headers["User"];//working
var userObj2 = JsonSerializer.Deserialize<UserDto>(userObj, new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = true
});//working
CurrentUser.Initialize(context);//working
var testResult = CurrentUser.Test();//working
}
}
所以我可以在 N-Layerd 项目中的任何地方使用 CurrentUser 静态类,并且我正在访问 UserId 或其他变量..
但我再说一遍,我认为这不是最好的解决方案。因为我必须将 [MyCustomAttribute] 添加到所有控制器。一定有更好的解决方案。