gpt4 book ai didi

asp.net-core - Asp.Net Core 中的 HttpContext.Features 与 HttpContext.Items

转载 作者:行者123 更新时间:2023-12-02 17:05:16 26 4
gpt4 key购买 nike

这两个属性有什么区别?

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

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

最佳答案

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

更清楚地说,HttpContext.Items旨在共享当前请求范围内的项目,而HttpContext.Features ,这是 IFeatureCollection 的一个实例,绝不是这样使用的。

IFeatureCollection接口(interface)代表了HTTP功能的集合,例如:

  1. IAuthenticationFeature其中存储原始PathBase和原始Path。
  2. ISessionFeature它存储当前 session 。
  3. IHttpConnectionFeature它存储底层连接。
  4. 等等。

帮助存储和检索 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-ValueFeatureCollection 配对,你最好不要。如您所见,Set<TFeature>(TFeature instance)如果集合中已存在某种类型,则将简单地替换旧的类型;这也意味着如果您有两个相同类型,将会出现错误。

关于asp.net-core - Asp.Net Core 中的 HttpContext.Features 与 HttpContext.Items,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51996907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com