【问题标题】:ASP.NET Core controller constructor: access request informationASP.NET Core 控制器构造函数:访问请求信息
【发布时间】:2018-05-25 03:07:32
【问题描述】:

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

我想访问类似请求上下文的东西在控制器构造函数中 来获取任意 HTTP 标头或 HttpContext.Items 或类似的东西,以便在创建我的 log 时使用它。

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

我唯一能想象的就是创建控制器publiclog 属性并编写一个设置此属性的IActionFilter。因为动作过滤器可以访问上下文和控制器实例。

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

【问题讨论】:

    标签: c# dependency-injection asp.net-core-mvc-2.0


    【解决方案1】:

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

    另一方面,如果您需要任何类型的业务级别日志记录(例如在操作主体内),请在控制器中使用注入的ILogger,但在流程完成之前您不应调用任何日志记录逻辑一个动作里面。到那时,您将拥有一个构建的请求上下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2020-09-01
      • 1970-01-01
      相关资源
      最近更新 更多