我在NetCore2.1中构建了REST
该项目分为以下几个部分:
我能否在模块中正确使用HTTPContext下载JWT中保存的UserId?
数据库的查询需要查询的令牌中有关UserId的信息。
我知道,当我调用控制器代码的作用域时,我将得到正确的值,但也会在另一个类中的另一个程序集中得到它吗?
当查询范围结束时,是否删除了HTTPContext内容?
发布于 2019-07-08 13:12:22
HttpContext有作用域生存期,现在是注入依赖项。在您无法直接访问它的地方(控制器/页/视图),您可以注入IHttpContextAccessor,这是一个知道如何在作用域中检索HttpContext实例的单例。
public class MyClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
public MyClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void MyMethod()
{
var userId = _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.NameIdentifier);
if (userId != null)
{
// do something
}
}
}HttpContext可能是空的,所以您需要使用空检查来处理它。
当然,您需要将MyClass注册到服务集合中,并且在需要时也需要注入它,否则所有这些都无法工作。此外,默认情况下不包括IHttpContextAccessor,因为这会对性能产生不可忽略的影响。如果您想使用应用程序的ConfigureServices,您需要添加以下行:
services.AddHttpContextAccessor();现在,所有的话,几乎忘记了我刚才告诉你的一切。别真的这么做。一个精心设计的课程应该遵循坚实的原则,其中之一就是它应该只做一件事,并把它做好。在大多数情况下,对于某个库中的类来说,拥有类似HttpContext之类的知识是完全不合适的。
相反,如果在某些方法中需要用户id,只需将其传递给该方法即可。
public void DoSomethingWithUserId(string userId)然后,在控制器中,例如,您已经可以访问HttpContext
myClass.DoSomethingWithUserId(User.FindFirstValue(ClaimTypes.NameIdenfiier));https://stackoverflow.com/questions/56934578
复制相似问题