c# - ASP.NET 核心 2.2 : what is the safest way of sharing request-specific data between framework classes?

标签 c# asynchronous asp.net-core dependency-injection .net-core

我正在尝试找出在 ASP.NET Core 2.2 Web 应用程序中的框架类之间共享一些特定于请求的数据的最干净、最安全的方法。

当我说框架类时,我指的是中间件或授权处理程序之类的类,广义上讲是处理用户请求的过程中涉及的框架类。

我正在寻找的共享想法是拥有某种隐式请求上下文或请求数据包,可从 HTTP 请求处理中涉及的所有框架类访问。

过去,我通过使用 AsyncLocal class 在 .NET Core 控制台应用程序中做了类似的事情。 .

我发现的可能的替代方案如下:

  • 使用自定义服务作为数据包并将其注册为 ASP.NET 核心 DI 容器上的作用域服务

  • 使用 HttpContext.Items property作为一种为特定请求上下文保存数据的方式

哪种方法是完成我想做的事情的最佳方法?在 ASP.NET core 中还有其他方法吗?

作为旁注,使用 AsyncLocal class 是否安全?作为在整个 ASP.NET Core 请求处理流程中的类之间共享数据的一种方式?我没有找到任何关于在 ASP.NET 核心中使用 AsyncLocal 的微软指南

感谢帮助

最佳答案

您几乎是自己回答的(这是一个巨大的优势,因为您不仅提出了正确的问题,而且还研究了可能的解决方案)。

使用HttpContext 的项目是最简单和最直接的方法。但这伴随着在接收值时转换对象的痛苦,可能会序列化并记住存储它的键(否则你最终会得到 magic strings )。

另一方面,使用范围服务是更成熟和专用的方式。如果您知道在您的数据包中期望什么,那么您可以为它实现一个具有属性的复杂服务,并且可能会缩小部分范围。那样的话,接收数据将是一种纯粹的乐趣。

我建议您分析实际需求以及该逻辑的使用频率。无论是要在很多地方使用还是只使用一次,也许是两次场景。牢记这一点,您应该完全有能力做出正确的决定。

遗憾的是,我对使用 AsyncLocal<T> 一无所知在 ASP.NET Core 中。

关于c# - ASP.NET 核心 2.2 : what is the safest way of sharing request-specific data between framework classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57043918/

相关文章:

multithreading - C#IE BHO : Do work asynchroniously while keeping to the same thread?

c# - ASP.NET CORE 2 IdentityUser POCO 错误

asp.net-core - asp.net core 2.1 HTTP 错误 502.5

caching - 浏览器后退按钮不执行 Controller 方法

c# - 如何在 C# 中正确制作 Dllimport?

c# - 如何在 Entity Framework 中使用 LINQ-to-SQL 回滚事务?

javascript - AngularJS - 使用 ng-click 在新窗口中打开链接

c# - 如果遇到不止一次,使自动映射器缓存对象

c# - 在 Visual Studio 中启动控制台应用程序的多个实例(使用不同的参数)?

c# - 等待多次回调