HttpContext.Features vs HttpContext.Items 在 Asp.Net 核心

HttpContext.Features vs HttpContext.Items In Asp.Net Core

这两个属性有什么区别?

我可以使用 HttpContext.Items 而不是 HttpContext.Featuresmiddlewares 之间共享数据。我看到的唯一区别是我告诉 Items 一个键,它给了我一个对象,我必须投射它。此转换可以在 Features 中自动完成。

他们背后还有别的东西吗?

正如您提到的,

HttpContext.Items 旨在共享短期的每次请求数据。

HttpContext.Features 旨在共享各种 HTTP 功能,这些功能允许中间件创建或修改应用程序的托管管道。它已经是来自 .NET 的 filled with several features,例如 IHttpSendFileFeature.

您应该使用 HttpContext.Items 来存储数据,并使用 HttpContext.Features 添加另一个中间件 class 可能需要的任何新 HTTP 功能。

最大的区别是HttpContext.Items是为了存放Key-Value-Pair,而HttpContext.Features是为了存放Type-Instance-Pair

更明确地说,HttpContext.Items是为了共享当前请求范围内的项目,而HttpContext.Features,它是IFeatureCollection的一个实例,绝不是那样使用。

IFeatureCollection 接口表示 HTTP 特性的集合,例如:

  1. IAuthenticationFeature 存放原始 PathBase 和原始 Path。
  2. ISessionFeature 存储当前会话。
  3. IHttpConnectionFeature 存储底层连接。
  4. 等等。

为了帮助存储和检索 Type-Instance-Pair,该接口具有三个重要方法:

public interface IFeatureCollection : IEnumerable<KeyValuePair<Type, object>>{
    // ...
    object this[Type key] { get; set; }
    TFeature Get<TFeature>();
    void Set<TFeature>(TFeature instance);
}

和实现 (FeatureCollection) 将简单地将值转换为所需的类型:

public class FeatureCollection : IFeatureCollection
{
    // ... get the required type of feature
    public TFeature Get<TFeature>()
    {
        return (TFeature)this[typeof(TFeature)];    // note: cast here!
    }

    public void Set<TFeature>(TFeature instance)
    {
        this[typeof(TFeature)] = instance;          // note!
    }
}

这是设计使然。因为不需要存储两个 IHttpConnectionFeature 个实例或两个 ISession 个实例。

虽然您可以用 FeatureCollection 存储一些 Type-Value 对,但最好不要。如您所见,如果集合中已存在某种类型,Set<TFeature>(TFeature instance) 将简单地替换旧的;这也意味着如果你有两个相同类型的,就会有一个错误。