对比 ASP.NET Core 中的 HttpContext.Features 与 HttpContext.Items

https://newbedev.com/httpcontext-features-vs-httpcontext-items-in-asp-net-core

最大的区别是 HttpContext.Items 是设计用来存储 键-值 对的,而 HttpContext.Features 是设计用来存储 类型-实例 对的。

说的更清楚一点,HttpContext.Items 用来存储在当前请求上下文中共享的数据,而 HttpContext.Features 中是一个 IFeatureCollection 的实例,与 Items 完全不同。

该 IFeatureCollection 实例表示一组 HTTP 特性的集合,例如:

  1. IAuthenticationFeature 存储原始的 PathBase 和 原始的 Path.
  2. ISessionFeature 存储当前的 Session.
  3. IHttpConnectionFeature 存储了当前的底层连接
  4. 其它

为了便于存储和提取 类型-实例 对,IFeatureCollection 接口定义了如下 3 个重要方法:

public interface IFeatureCollection : IEnumerable<KeyValuePair<Type, object>>{
// ...
object this[Type key] { get; set; }
TFeature Get<TFeature>();
void Set<TFeature>(TFeature instance);
}

在 IFeatureCollection 的实现 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!
}
}

就是这样设计的。因为在当前请求中不需要存储 2 个 IHttpConnectionFeature 实例,或者 2 个 ISession

尽管从技术上来说,你可以使用 FeatureColliection 来存储其它的 类型-值 对,最好不要这样做。如你所见,Set<TFeature>(TFeature instance) 方法在类型已经存储集合中的时候,会简单地替换掉原来的实例,这就意味着如果你希望存储同一类型的两个实例,是做不到的。

HttpContext.Items 是设计用来存储在单个请求中短期存在的数据。

HttpContext.Features 是设计用来共享不同的 HTTP 特性的,这使得中间件可以创建或者修改应用程序的主机处理管线。通过 .NET 本身已经创建了一系列的特性,例如 IHttpSendFileFeature。

应该只使用 HttpContext.Items 来存储数据,使用 HttpContext.Features 来添加新的其它中间件可能会使用的 HTTP 特性。

参考:

对比 ASP.NET Core 中的 HttpContext.Features 与 HttpContext.Items的更多相关文章

  1. 在ASP.NET Core中怎么使用HttpContext.Current (转载)

    一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目 ...

  2. ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解 (转载)

    “传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Core 程序中,Kestrel 是一个基于 li ...

  3. ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解

    笔者没有学 ASP.NET,直接学 ASP.NET Core ,学完 ASP.NET Core MVC 基础后,开始学习 ASP.NET Core 的运行原理.发现应用程序有一个非常主要的 “传导体” ...

  4. 在ASP.NET Core中怎么使用HttpContext.Current

    一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目 ...

  5. 在ASP.NET Core中实现一个Token base的身份认证

    注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and authorization in ASP.NET Core 在 ...

  6. ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界

    HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到Http ...

  7. ASP.NET Core中如何调整HTTP请求大小的几种方式

    一.前言 一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请求值. 在ASP.NET Co ...

  8. 谈谈ASP.NET Core中的ResponseCaching

    前言 前面的博客谈的大多数都是针对数据的缓存,今天我们来换换口味.来谈谈在ASP.NET Core中的ResponseCaching,与ResponseCaching关联密切的也就是常说的HTTP缓存 ...

  9. 探索ASP.NET Core中的IStartupFilter

    原文:Exploring IStartupFilter in ASP.NET Core 作者:Andrew Lock 译者:Lamond Lu 在本篇博客中,我将介绍一下IStartupFilter, ...

  10. 在Asp.Net Core中使用中间件保护非公开文件

    在企业开发中,我们经常会遇到由用户上传文件的场景,比如某OA系统中,由用户填写某表单并上传身份证,由身份管理员审查,超级管理员可以查看. 就这样一个场景,用户上传的文件只能有三种人看得见(能够访问) ...

随机推荐

  1. 《Vue.js 设计与实现》读书笔记 - 第15章、编译器核心技术概览

    第15章.编译器核心技术概览 15.1 模板 DSL 的编译器 完整的编译包括 [源代码] -->词法分析-->语法分析-->语义分析(编译前端) -->中间代码生成--> ...

  2. MYSQL存储过程-练习2 while 循环

    MYSQL存储过程-练习2 while 循环 1 #WHILE循环 2 DELIMITER $$ 3 4 CREATE PROCEDURE `sp_while`() 5 BEGIN 6 DECLARE ...

  3. 别人可以访问本项目的ip地址

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  4. CF980-Div2-D

    CF980-Div2-D 题意 从 \(1\) 开始决策,若选当前数,则累计贡献 \(a[i]\) 并跳到 \(j\) 位置,\(j\) 是 \(\lt i\) 且没有决策过(包括选了和没选)的最大位 ...

  5. Python运行报错:ImportError: cannot import name 'BinarySpaceToDiscreteSpaceEnv' from 'nes_py.wrappers'

    运行Python项目: https://pypi.org/project/gym-super-mario-bros/ 报错: ImportError: cannot import name 'Bina ...

  6. python基础之__init__.py

    如何使用 在 Python 中,当一个目录被作为包来使用时,它会在包中寻找一个名为 __init__.py 的文件.如果该文件存在,Python 会将它加载到内存中,并在其中执行所有的代码. __in ...

  7. 多校A层冲刺NOIP2024模拟赛09

    多校A层冲刺NOIP2024模拟赛09 考试唐完了,T2.T4 都挂了 100 分,人麻了. 排列最小生成树 给定一个 \(1, 2,\dots , n\) 的排列 \(p_1, p_2,\dots, ...

  8. Linux下二维码识别库Zbar的安装与使用

    1. 安装Zbar sudo apt-get install libzbar-dev 2. 识别流程 读取图像并转换为Zbar内建图像类型 创建Zbar扫描器 设置扫描参数 扫描图像并获取结果 #in ...

  9. (Python基础教程之十九)Python优先级队列示例

    1.什么是优先队列 优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但每个元素还具有与之关联的"优先级". 在优先级队列中,优先级高的元素先于优先级低的元素提供. 如果 ...

  10. Java线程池架构2-多线程调度器

      http://ifeve.com/java线程池架构2-多线程调度器(scheduledthreadpoolexecutor)/ 在前面介绍了java的多线程的基本原理信息:<Java线程池 ...