我一直在尝试在ASP.NET MVC和system.web中实现http上下文,它只是允许我使用HttpContext.Current来访问上下文。无论如何,我开始在StartUp类的configureService方法中注入IhttpcontextAccessor。 我发布此帖以查看是否有人使用.Net Core 2.0实现了此功能。 如果是这样,请随时分享知识。提前谢谢。
services.AddSingleton<HttpContextAccessor, HttpContextAccessor>();
答案 0 :(得分:8)
如果您需要来自Controller,那么只需使用HttpContext
,就像Muqeet的回答所说的那样。
如果您确实需要注入它,那么您使用AddSingleton
进入了正确的轨道,但是您有一个小错误:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
注意第一种类型中的I
。
然后设置你的构造函数:
public class UserService : IUserService {
private readonly HttpContext _context;
public UserService(IHttpContextAccessor httpContextAccessor) {
_context = httpContextAccessor.HttpContext;
}
}
然后,您可以在班级的其他任何地方使用context
。
这是依赖注入的基础知识。 AddSingleton
使其可用于注射。然后通过将它添加到构造函数中,在需要的地方询问它。
Maarten在其评论中所附的那篇文章更详细地解释了这一点。
答案 1 :(得分:6)
查看您的代码示例,您似乎正在尝试在控制器中获取HttpContext信息。您不要需要注入HttpContextAccessor,因为categories
已经可以作为HttpContext
上的属性使用。您可以像使用任何其他财产一样使用它。
Controller
如果您尝试访问服务中的HttpContext对象,那么构造函数会注入[Authorize]
public async Task<IActionResult> MySecureAction()
{
_logger.LogDebug($"Logged in User is {HttpContext.User.Identity.Name}");
return OK();
}
。
在即将发布的ASP.NET Core 2.1版本中,将有一个帮助程序扩展方法IHttpContextAccessor
可供您正确地将其添加到服务集合中。