ASP.NET核心控制器构造函数:访问请求信息

ASP.NET Core controller constructor: access request information

我有一个带有 ILog log 字段的基础控制器 class,它是在自定义记录器服务的构造函数中设置的,通过依赖注入传递。

我想在控制器构造函数中访问请求上下文之类的东西来获取任意HTTPheader或HttpContext.Items或类似的东西来使用它创建我的 log.

我尝试使用 IHttpContextAccessor。它给了我 DefaultHttpContext,其中不包含由中间件添加的 Items

我唯一能想到的就是制作 log 属性 控制器 public 并写一个 IActionFilter 来设置这个 属性。因为动作过滤器可以访问上下文和控制器实例。

我觉得控制器构造函数中没有请求上下文很奇怪,因为请求信息对于避免操作中的样板代码很有用。无论如何,控制器都是根据请求创建的,因此在构造函数中使用一些请求数据没有什么坏处。

对于请求级别的日志记录,使用 ActionFilter 属性并向其注入 ILogger。我不确定,但我认为在 MVC 5+ 中,操作过滤器属性支持依赖注入。如果没有,您可以实施 IFilterProvider 来将属性附加和实例化到您想要的请求,而不是在 GlobalFilters 中注册。

另一方面,如果您需要任何类型的业务级别日志记录(例如在操作主体中),请在控制器中使用注入的 ILogger,但您不应调用任何日志记录逻辑直到进程在一个动作中。到那时你已经有了一个内置的请求上下文。