在.NET Core 3中,如何在控制器的构造函数中访问HttpContext?

3

如何在.NET Core 3.1控制器的构造函数中访问HttpContext?

在构造函数中,HttpContext总是为空,但在实际方法中可用。在MVC 4中可以实现此功能,在尝试将项目移植到.NET Core时遇到了这个问题。

如果我尝试通过DI使用HttpContextAccessor,则会出现异常:

InvalidOperationException: 在尝试激活'MyProject.Controllers.UsersController'时无法解析类型为'Microsoft.AspNetCore.Http.HttpContextAccessor'的服务


你是否注入了接口而不是具体类型? - sellotape
3
我认为你不能在.NET Core中做到这一点,并且我会质疑你为什么首先要这样做。 - DavidG
@DavidG - 在依赖注入容器中,这只是一个单例;您应该能够在任何地方注入它。但在这种情况下是否明智/有用是另一回事... - sellotape
@Nkosi - 我刚刚做到了;运行良好。与前面评论一样,请注意免责声明。 - sellotape
1
@DavidG 问题在于我需要使用来自用户的值初始化一些服务。在MVC 4中,我是在构造函数中完成这个过程的,所以整个过程只需在一个地方完成。现在看来,我需要在控制器的每个约15个函数中都执行这个过程,这似乎很凌乱。 - NickG
显示剩余2条评论
2个回答

6
你可以使用 IHttpContextAccessor 来访问 HttpContext
要访问 HttpContext,你需要将 services.AddHttpContextAccessor() 添加到 ConfigureService 方法中。
services.AddHttpContextAccessor();

在构造函数中依赖注入获取IHttpContextAccessor

private readonly IHttpContextAccessor _httpContextAccessor;

public UsersController(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

访问HttpContext

_httpContextAccessor.HttpContext

我不确定为什么这个有赞成票。正如我在问题中所说的,我已经尝试过了,在控制器的构造函数中它不起作用 - 它只会抛出异常。 - NickG
@NickG 但是我根据Microsoft文档使用它,没有任何问题。 - Farhad Zamani
文档中并没有展示在控制器中被积极使用,仅被分配给一个本地变量。如果你使用它来尝试获取HttpContext.Request,例如,你会得到我发表的异常。 - NickG
使用Core 3.1运行良好。 - DavidC

0

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