【问题标题】:Accessing HTTP Headers in ASP.Net Core Business Logic在 ASP.Net Core 业务逻辑中访问 HTTP 标头
【发布时间】:2017-08-08 01:43:03
【问题描述】:

我正在使用 ASP.Net 核心,并且我需要访问业务逻辑类(不是控制器或操作)中的特定 HTTP 标头。

为了提供此处配置的全貌,我有一个自定义的 ASP.Net Core 中间件,它基于某些逻辑将一个值添加到自定义 HTTP 标头中,我需要访问此标头中的值业务逻辑类。

目前我实现这一点的方法是注入一个 HttpContextAccessor,使用以下 DI 注册。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

在需要访问 HTTP 标头的类中,然后我使用构造函数注入请求 IHttpContextAccessor 并使用它来访问相关的 HTTP 标头。

执行上述操作很好,并给了我所需的结果,查看 Internet 上的各种文章,但普遍的共识似乎是避免在 ASP.Net Core 中使用 HttpContext.Current。

如果是上述情况,我的业务逻辑类是否有更好的方法来访问我的自定义中间件插入自定义 HTTP Header 的值?

我应该清楚,虽然目前中间件将所需的值存储在 HTTP 标头中以供业务逻辑类使用,但我对中间件的其他方法持开放态度,使业务逻辑类可以使用所需的值有更好的方法。

如有任何问题或澄清,请告诉我。

【问题讨论】:

  • 某些实现需要访问上下文以获取值。但是,这不应该是业务层。创建一个提供所需标头值的服务。该类将采用上下文。然后类抽象将成为您的业务类的依赖项
  • 实际上 - 它是一个服务类,目前正在上下文中。我应该在这里更具体一些,但是通过引用一个业务逻辑类,我真的只是想清楚地表明这不是一个控制器或动作。所以一般来说,传递一个访问 HTTP 上下文的服务似乎是你推荐的?

标签: asp.net-core asp.net-core-mvc .net-core asp.net-core-webapi


【解决方案1】:

ASP.Net Core 中没有HttpContext.Current,所以很容易避免使用它。如果需要,您必须实现自己的扩展方法,但 .Net Core 社区的普遍感觉是使用 IHttpContextAccessor 会好得多。

在早期版本的 .Net Core 中,IHttpContextAccessor 的实现会自动注册到 DI 容器中。在最新版本中,您必须使用您提到的代码行自己注册:

 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

IHttpContext 注入需要访问标头的方法中是一种可行的方法。或者,如果您愿意,可以使用辅助方法将标题的副本放在更简单的结构中,然后将该对象传递给您的类,因为它实际上不需要访问完整的HttpContext

【讨论】:

  • 我想知道这在不过多调整 ASP.Net 编程模型的情况下是否可行:使用过滤器或中间件从标头构造对象并将其注入控制器?
  • 我认为这是非常可行的。例如,您可以使用返回 AppHeaders 对象的 DI 容器注册 AppHeadersAccessor 对象。您甚至不需要中间件或操作过滤器,因为 AppHeadersAccessor 对象可以通过构造函数注入接收 HttpContextAccessor 对象(前提是您按照我在回答中提到的那样注册了它。)所以它拥有填充 AppHeaders 对象所需的一切你想要的标题信息。
猜你喜欢
  • 2021-02-24
  • 2011-12-03
  • 2011-09-03
  • 1970-01-01
  • 2012-04-25
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多