1 c# asp.net-core asp.net-core-2.0
这是一个asp.net核心项目.这是我的代码.
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(...);
services.AddHttpContextAccessor();
services.TryAddSingleton<IUserInfo,UserInfo>();
Run Code Online (Sandbox Code Playgroud)
第一个代码:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个代码:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用第一个代码时Action,它很好.HttpContext.Request.Headers["Authorization"]有我的令牌,IsAuthenticated是真的.
但是当我使用第二个代码时,它无法工作.HttpContext是不正确的.HttpContext.Request.Headers["Authorization"]是空的,IsAuthenticated是假的.
我想知道这就是原因,谢谢.
如果你不明白我的话,我很抱歉,我的英语非常糟糕......
IUserInfo,UserInfo 注册为单身,所以它只会被初始化一次.(记住,这很重要)
在第一个示例中,每次GetUserData()调用都会_httpContextAccessor.HttpContext返回当前请求HttpContext.
在第二个例子中,HttpContext只会在单例类的构造函数中设置一次.这意味着每次GetUserData()调用时,您将获得第一次初始化时设置的相同上下文.这意味着正在使用的上下文不会是当前请求的上下文,因为在初始化类时请求将不可用.
第一个示例是建议的访问当前的方法HttpContext.
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |