【问题标题】:How to implement HttpContext in .net core 2.0?如何在 .net core 2.0 中实现 HttpContext?
【发布时间】:2018-05-28 15:43:44
【问题描述】:

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

 services.AddSingleton<HttpContextAccessor, HttpContextAccessor>();

【问题讨论】:

标签: c# asp.net asp.net-core-2.0 asp.net-2.0


【解决方案1】:

如果您需要控制器提供它,那么只需使用 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 在他的评论中链接到的那篇文章更详细地解释了。

【讨论】:

  • 谢谢您,我认为您让我走上了正确的道路,我会将您的答案标记为正确答案,但如果我可能会问您如何在方法中检查当前登录的用户。例如索引方法
  • 你使用_context.User。例如,帐户名称为_context.User.Identity.Name
  • 谢谢,不胜感激
  • 当 HttpContext 已经作为属性在 ControllerBase 中可用时,为什么还要将其作为依赖项?你只是做 HttpContext.User.Identity.Name 对吗?
  • @MuqeetKhan 哈!原来如此!那为什么大家都用它来谈论依赖注入呢?那是一团糟。添加您自己的答案。我会投票赞成。
【解决方案2】:

在控制器中

查看您的代码示例,您似乎正在尝试在控制器中获取 HttpContext 信息。您不需要需要注入 HttpContextAccessor,因为 HttpContext 已经作为 Controller 上的属性可供您使用。您可以像使用任何其他属性一样使用它。

示例

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

在服务中

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

Asp.Net Core 2.1

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

【讨论】:

  • 意识到我不必必须注入 HttpContextAccessor,这让我的生活变得轻松多了。感谢您提及!
猜你喜欢
  • 1970-01-01
  • 2018-09-20
  • 2018-03-13
  • 2018-03-21
  • 2021-05-15
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多