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)
如果你需要一个控制器,那么只需使用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在其评论中所附的那篇文章更详细地解释了这一点.
查看您的代码示例,看起来您正在尝试在控制器中获取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版本中,将有一个帮助程序扩展方法AddHttpContextAccessor可供您正确地将其添加到服务集合中.