如何在.NET Core 2.0中实现HttpContext?

4

我一直在尝试在ASP.NET MVC和system.web中实现http上下文,它只需允许我使用HttpContext.Current来访问上下文。无论如何,我首先在StartUp类的configureService方法中注入了IhttpcontextAccessor。

我发布这篇文章是为了看看是否有人使用.Net Core 2.0实现了这一点。如果有,请随时分享知识。谢谢。

 services.AddSingleton<HttpContextAccessor, HttpContextAccessor>();

1
HttpContext.Current在.NET Core中已被移除,因此您将无法使用它。有关更多信息,请参见此处:https://dev59.com/k1kT5IYBdhLWcg3wc_NR - Sasha
实际上在这里想做什么?你真正的问题是什么? - spender
@spender 我想要识别当前登录的用户。 - cedPound
1
@cedPound 或许这个链接会有所帮助:https://dotnetcoretutorials.com/2017/01/05/accessing-httpcontext-asp-net-core/ - Maarten
2个回答

10

如果您需要从控制器(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在他的评论中提供的文章会更详细地解释。


谢谢,我认为你让我找对了方向,我会将你的答案标记为正确的。但是,如果我可以问一下,在一个方法中如何检查当前登录的用户。例如,索引方法。 - cedPound
您可以使用 _context.User。例如,账户的名称将会在_context.User.Identity.Name中。 - Gabriel Luci
谢谢,感激不尽。 - cedPound
1
为什么在ControllerBase的属性中已经有HttpContext了,还要将其作为依赖项获取?你只需要使用HttpContext.User.Identity.Name就可以了吧? - Muqeet Khan
@MuqeetKhan 哈!原来是这样啊!那为什么每个人都要用依赖注入呢?这太混乱了。请添加您自己的答案,我会点赞的。 - Gabriel Luci
@Gabriel-Luci 因为它可以通过继承 Controller 获得,Controller 又继承自 ControllerBase,而 ControllerBase 包含 HttpContext 和 User。如果您在一个不继承 Controller 的服务中尝试这样做,您就无法自然地访问它。 - Red

7

在控制器中

看起来您的代码示例是想在控制器中获取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让我的生活变得轻松了很多。感谢您提到这一点! - Aaron Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接