HttpContext.Features vs HttpContext.Items 在 Asp.Net 核心
HttpContext.Features vs HttpContext.Items In Asp.Net Core
这两个属性有什么区别?
我可以使用 HttpContext.Items
而不是 HttpContext.Features
在 middlewares
之间共享数据。我看到的唯一区别是我告诉 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 特性的集合,例如:
IAuthenticationFeature
存放原始 PathBase 和原始 Path。
ISessionFeature
存储当前会话。
IHttpConnectionFeature
存储底层连接。
- 等等。
为了帮助存储和检索 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)
将简单地替换旧的;这也意味着如果你有两个相同类型的,就会有一个错误。
这两个属性有什么区别?
我可以使用 HttpContext.Items
而不是 HttpContext.Features
在 middlewares
之间共享数据。我看到的唯一区别是我告诉 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 特性的集合,例如:
IAuthenticationFeature
存放原始 PathBase 和原始 Path。ISessionFeature
存储当前会话。IHttpConnectionFeature
存储底层连接。- 等等。
为了帮助存储和检索 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)
将简单地替换旧的;这也意味着如果你有两个相同类型的,就会有一个错误。