ASP.NET Core自定义类中注入HttpContext

官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2

当在我们自定义的类中需要用到HttpContext时,可以使用依赖注入功能将IHttpContextAccessor注入到类中,然后通过IHttpContextAccessorHttpContext属性获取HttpContext的实例,但是需要注意一点,如果我们的类使用的是单例模式注入的,那么不可以在类的构造函数中将IHttpContextAccessorHttpContext属性保存为一个成员变量,否则无法获取有效的HttpContext

有以下两种使用方式;

第一种

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class JwtLoginInfo : ILoginInfo
{
private readonly IHttpContextAccessor _httpContextAccessor;

public JwtLoginInfo(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}

public Guid AccountId
{
get
{
var accountId = _httpContextAccessor.HttpContext.User.FindFirst("id");

if (accountId != null && accountId.Value.NotNull())
{
return new Guid(accountId.Value);
}

return Guid.Empty;
}
}
}

第二种

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class JwtLoginInfo : ILoginInfo
{
private readonly HttpContext _httpContext;

public JwtLoginInfo(IHttpContextAccessor httpContextAccessor)
{
_httpContext = httpContextAccessor.HttpContext;
}

public Guid AccountId
{
get
{
var accountId = _httpContext.User.FindFirst("id");

if (accountId != null && accountId.Value.NotNull())
{
return new Guid(accountId.Value);
}

return Guid.Empty;
}
}
}

针对以上两种方式需要注意,如果JwtLoginInfo使用单例注入,那么只能用第一种方式,如果使用的Scoped注入,那么两种方式都可以