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
,但您不应调用任何日志记录逻辑直到进程在一个动作中。到那时你已经有了一个内置的请求上下文。
我有一个带有 ILog log
字段的基础控制器 class,它是在自定义记录器服务的构造函数中设置的,通过依赖注入传递。
我想在控制器构造函数中访问请求上下文之类的东西来获取任意HTTPheader或HttpContext.Items
或类似的东西来使用它创建我的 log
.
我尝试使用 IHttpContextAccessor
。它给了我 DefaultHttpContext
,其中不包含由中间件添加的 Items
。
我唯一能想到的就是制作 log
属性 控制器 public
并写一个 IActionFilter
来设置这个 属性。因为动作过滤器可以访问上下文和控制器实例。
我觉得控制器构造函数中没有请求上下文很奇怪,因为请求信息对于避免操作中的样板代码很有用。无论如何,控制器都是根据请求创建的,因此在构造函数中使用一些请求数据没有什么坏处。
对于请求级别的日志记录,使用 ActionFilter
属性并向其注入 ILogger
。我不确定,但我认为在 MVC 5+ 中,操作过滤器属性支持依赖注入。如果没有,您可以实施 IFilterProvider
来将属性附加和实例化到您想要的请求,而不是在 GlobalFilters
中注册。
另一方面,如果您需要任何类型的业务级别日志记录(例如在操作主体中),请在控制器中使用注入的 ILogger
,但您不应调用任何日志记录逻辑直到进程在一个动作中。到那时你已经有了一个内置的请求上下文。