如何在.net core 2.0中实现HttpContext?

ced*_*und 3 c# asp.net asp.net-2.0 asp.net-core-2.0

我一直在尝试在ASP.NET MVC和system.web中实现http上下文,它只是允许我使用HttpContext.Current来访问上下文.无论如何,我开始在StartUp类的configureService方法中注入IhttpcontextAccessor.我发布此帖以查看是否有人使用.Net Core 2.0实现了此功能.如果是这样,请随时分享知识.提前致谢.

 services.AddSingleton<HttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)

Gab*_*uci 9

如果你需要一个控制器,那么只需使用HttpContext,正如Muqeet的回答所说的那样.

如果你确实需要注射它,那么你就是在正确的轨道上AddSingleton,但你有一个小错误:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)

请注意I第一种类型.

然后设置你的构造函数:

public class UserService : IUserService {
    private readonly HttpContext _context;

    public UserService(IHttpContextAccessor httpContextAccessor) {
        _context = httpContextAccessor.HttpContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以context在班上的任何其他地方使用.

这是依赖注入的基础知识.AddSingleton使其可用于注射.然后通过将其添加到构造函数中,在需要的地方询问它.

Maarten在其评论中所附的那篇文章更详细地解释了这一点.


Muq*_*han 6

在控制器中

查看您的代码示例,看起来您正在尝试在控制器中获取HttpContext信息.你不要需要注入HttpContextAccessor,因为HttpContext已经为您提供为在一个属性Controller.您可以像使用任何其他财产一样使用它.

[Authorize]
public async Task<IActionResult> MySecureAction()
{
   _logger.LogDebug($"Logged in User is {HttpContext.User.Identity.Name}");
   return OK();
}
Run Code Online (Sandbox Code Playgroud)

在服务中

如果您尝试访问服务中的HttpContext对象,那么您将构造函数注入IHttpContextAccessor.

Asp.Net Core 2.1

在即将发布的ASP.NET Core 2.1版本中,将有一个帮助程序扩展方法AddHttpContextAccessor可供您正确地将其添加到服务集合中.