Asp.Net Core中的HttpContext.Features与HttpContext.Items

时间:2018-08-24 03:10:24

标签: asp.net-core httpcontext

这两个属性之间有什么区别?

我可以使用def reset(self): self.curr_idx = 0 self.nd_text = [] self.nd_img = [] self.ndlabel = [] for buck in self.data: label = self.answer # self.answer, self.img are get from npy file self.nd_text.append(mx.ndarray.array(buck, dtype=self.dtype)) self.nd_img.append(mx.ndarray.array(self.img, dtype=self.dtype)) self.ndlabel.append(mx.ndarray.array(label, dtype=self.dtype)) 代替HttpContext.ItemsHttpContext.Features之间共享数据。我看到的唯一区别是,我告诉middlewares输入密钥,它给了我对象,因此我必须强制转换它。可以自动在Items中进行投射。

他们身后还有其他东西吗?

2 个答案:

答案 0 :(得分:2)

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

更清楚地说,HttpContext.Items旨在共享当前请求范围内的项目,而HttpContext.FeaturesIFeatureCollection的实例,决不是那样用。

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实例。

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

答案 1 :(得分:1)

HttpContext.Items旨在共享短暂的每个请求数据。

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

您应该使用HttpContext.Items存储数据,并使用HttpContext.Features添加其他中间件类可能需要的所有新HTTP功能。