我有一个带有ILog log
字段的基本控制器类,它是在自定义记录器服务的构造函数中设置的,通过依赖注入传递。
我想在控制器构造函数中访问请求上下文以获取任意HTTP标头或HttpContext.Items
或类似内容,以便在创建{{1}时使用它}。
我尝试使用log
。它为我提供了IHttpContextAccessor
,其中不包含由中间件添加的DefaultHttpContext
。
我能想象的唯一一件事就是设置控制器Items
的{{1}}属性并编写一个设置此属性的log
。因为操作过滤器可以访问上下文和控制器实例。
在控制器构造函数中没有请求上下文对我来说看起来很奇怪,因为请求信息对于避免操作中的样板代码很有用。无论如何,每个请求都会创建控制器,因此在构造函数中使用某些请求数据没有坏处。
答案 0 :(得分:0)
对于请求级别日志记录,请使用ActionFilter
attrbute并为其注入ILogger
。我不确定,但我认为在MVC 5+中,动作过滤器属性支持依赖注入。如果没有,您可以实施GlobalFilters
,而不是在IFilterProvider
中注册,以便将属性附加并实例化到您想要的请求中。
另一方面,如果您需要任何类型的业务级别日志记录(例如在操作体内),请使用控制器中注入的ILogger
,但是之后不应调用任何日志记录逻辑进程在一个动作中。那时你已经有了一个建立的请求上下文。