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

标签 asp.net-core httpcontext

这两个属性有什么区别?

我可以使用 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/

相关文章:

Docker 复制命令失败

c# - System.Text.Json:使用自动转换反序列化 JSON

asp.net - 如何从非页面的类访问 GetGlobalResourceObject 函数?

c# - 如何模拟或伪造 HttpApplication/HttpContext 进行测试

asp.net - 我可以欺骗 HttpRequest.Current.Request.IsLocal 吗?

ubuntu - 在 ServiceStack.Core 中,HttpContextAccessor.HttpContext 在 Linux 上为空,而在 Windows 上为非空

reactjs - 如何在单个 ASP.NET Core 站点上托管多个 React SPA 应用程序?

c# - IdentityServer4 token 签名验证

asp.net-mvc - 在 MVC2 + EF4 中保存用户名

c# - 使用 Identity Server 4 在包含 View 和资源的 MVC 核心应用程序中刷新访问 token 的最佳实践