gpt4 book ai didi

c# - 为什么 IHttpContextAccessor.HttpContext 不正确

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:31 25 4
gpt4 key购买 nike

这是一个asp.net核心项目。这是我的代码。

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(...);
services.AddHttpContextAccessor();
services.TryAddSingleton<IUserInfo,UserInfo>();

第一个代码:

public class UserInfo : IUserInfo
{
private readonly IHttpContextAccessor _httpContextAccessor;

public UserInfo(IHttpContextAccessor iHttpContextAccessor)
{
_httpContextAccessor = iHttpContextAccessor;
}

public UserData GetUserData()
{
if (_httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
{
// do something
}
}
}

第二个代码:

public class UserInfo : IUserInfo
{
private readonly HttpContext _httpContext;

public UserInfo(IHttpContextAccessor iHttpContextAccessor)
{
_httpContext= iHttpContextAccessor.HttpContext;
}

public UserData GetUserData()
{
if (_httpContext.User.Identity.IsAuthenticated)
{
// do something
}
}
}

当我在 Action 中使用第一个代码时,没问题。 HttpContext.Request.Headers["Authorization"] 有我的 token 并且 IsAuthenticated 为真。

但是当我使用第二个代码时,它无法工作。 HttpContext 不正确。 HttpContext.Request.Headers["Authorization"] 为空且 IsAuthenticated 为 false。

我想知道这是为什么,谢谢。

如果你听不懂我的话,我很抱歉,我的英语很糟糕......

最佳答案

IUserInfo,UserInfo 被注册为单例,所以它只会被初始化一次。(记住,这很重要)

在第一个示例中,每次调用 GetUserData() 时,_httpContextAccessor.HttpContext 都会返回当前请求的 HttpContext

在第二个示例中,HttpContext 只会在单例类的构造函数中设置一次。这意味着每次调用 GetUserData() 时,您将获得与第一次初始化时设置的完全相同的上下文。这意味着正在使用的上下文不会是当前请求的上下文,因为在初始化类时该请求尚不可用。

第一个示例是访问当前 HttpContext 的建议方法。

关于c# - 为什么 IHttpContextAccessor.HttpContext 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51101163/

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