【问题标题】: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] 添加到所有控制器。一定有更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2019-12-26
    相关资源
    最近更新 更多