这两个属性有什么区别?
我可以使用 HttpContext.Items
而不是 HttpContext.Features
在中间件
之间共享数据。我看到的唯一区别是我告诉 Items
一个键,它给了我一个对象,我必须转换它。此转换可以在Features
中自动完成。
他们背后还有别的东西吗?
最佳答案
最大的区别是HttpContext.Items
旨在存储 Key-Value-Pair
,而HttpContext.Features
旨在存储 Type-Instance-Pair
。
更清楚地说,HttpContext.Items
旨在共享当前请求范围内的项目,而HttpContext.Features
,这是 IFeatureCollection
的一个实例,绝不是这样使用的。
IFeatureCollection
接口(interface)代表了HTTP功能的集合,例如:
-
IAuthenticationFeature
其中存储原始PathBase和原始Path。 -
ISessionFeature
它存储当前 session 。 -
IHttpConnectionFeature
它存储底层连接。 - 等等。
帮助存储和检索 Type-Instance-Pair
,该接口(interface)有3个重要方法:
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)
如果集合中已存在某种类型,则将简单地替换旧的类型;这也意味着如果您有两个相同类型,将会出现错误。
关于asp.net-core - Asp.Net Core 中的 HttpContext.Features 与 HttpContext.Items,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51996907/