我正在尝试找出在 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/