天天看點

ASP.NET Core 中的 Request Feature

ASP.NET Core 中的 Request Feature

​​https://docs.microsoft.com/en-us/aspnet/core/fundamentals/request-features?view=aspnetcore-6.0​​

在應用程式對象和中間件中所用來處理請求的 ​

​HttpContext​

​​ API 有一個被稱為 ​

​feature 接口​

​​ 的底層抽象。每個 feature 提供器提供一個通過 ​

​HttpContext​

​​ 暴露出來的小粒度功能子集。這樣在不需要重新整個實作 ​

​HttpContext​

​ 的情況下處理入站請求,而這些接口可以被伺服器或者中間件添加、修改、封裝、替換,或者甚至被删除掉。當測試的時候,它們還可以被用來 mock 功能。

Feature 集合

​HttpContext​

​​ 的 ​

​Features​

​ 屬性提供了針對目前請求通路這些 feature 接口的入口。由于該特性集是可變的,甚至是在請求處理過程中,中間件可以用來修改該特性集,并添加其它的特性。有些進階的 feature 隻能通過特性集的接口來通路。

集合的類型是 ​​IFeatureCollection​​​,它的實作類型是 ​​FeatureCollection​​。通過定義可以看到,該集合實際上是 一個字典集合,字典的 key 為類型 Type,在這裡并沒有統一的 IFeature 接口。

Feature 接口

  1. ​​IHttpRequestFeature​​: 定義 HTTP 請求結構,包括協定、路徑、查詢參數、請求頭以及請求體。該特性是處理請求所必須的。
  2. ​​IHttpResponseFeature​​: 定義 HTTP 響應結構,包括狀态碼、響應頭以及響應體。該特性是處理請求所必須的。
  3. ​​IHttpResponseBodyFeature​​​: 定義通過各種方式輸出響應體,使用 ​

    ​Stream​

    ​ 或者 ​

    ​PipeWriter​

    ​ 或者檔案。該特性是處理請求所必須的。它替換了 ​

    ​IHttpResponseFeature.Body​

    ​ 和 ​

    ​IHttpSendFileFeature​

  4. ​​IHttpAuthenticationFeature​​​: 持有目前請求相關的 ​​ClaimsPrincipal​​
  5. ​​IFormFeature​​: 用于解析和緩存入站的 HTTP 請求和送出的 multipart 表單。
  6. ​​IHttpBodyControlFeature​​: 用來控制對于請求或者響應是否允許同步 IO 操作。
  7. ​​IHttpActivityFeature​​: 用來為 diagnostic 監聽器添加 Activity 資訊。注意它出現在 .NET 6 中。
  8. ​​IHttpConnectionFeature​​: 定義網絡連接配接的 id 屬性,本地與遠端位址和端口。
  9. ​​IHttpMaxRequestBodySizeFeature​​: 控制對于目前請求來說,最大可支援的請求體大小。
  10. ​​IHttpRequestBodyDetectionFeature​​: 識别目前請求是否含有請求體。從 .NET 5 開始支援。
  11. ​​IHttpRequestIdentifierFeature​​: 添加可以用來唯一辨別請求的屬性。
  12. ​​IHttpRequestLifetimeFeature​​: 定義支援中斷網絡連接配接,以及檢測目前請求是否已經被提前終止。例如由于用戶端斷開連接配接。
  13. ​​IHttpRequestTrailersFeature​​​: 提供通路請求的 trailer 頭,如果存在的話。例如 HTTP/1.1 中的塊化請求體,或者 HTTP/2 中的 ​​Trailer​​ 請求頭。
  14. ​​IHttpResetFeature​​: 用來對于支援它們的協定,比如 HTTP/2 或者 HTTP/3 發送重置消息。
  15. ​​IHttpResponseTrailersFeature​​: 如果支援的話,為應用程式啟用響應 trailer 頭支援。
  16. ​​IHttpUpgradeFeature​​​: 定義對于 ​​HTTP Upgrade​​ 的支援。如果伺服器支援切換協定的話,它支援用戶端指定其希望使用的協定。
  17. ​​IHttpWebSocketFeature​​: 定義支援 Web socket 的 API
  18. ​​IHttpsCompressionFeature​​: 控制在 HTTPS 連接配接上響應是否被壓縮。
  19. ​​IItemsFeature​​: 為請求應用程式狀态存儲 Items 集合
  20. ​​IQueryFeature​​: 解析和緩存查詢串
  21. ​​IRequestBodyPipeFeature​​​: 将請求體表示為 ​​PipeReader​​ 形式
  22. ​​IRequestCookiesFeature​​​: 解析和緩存請求中的 ​

    ​Cookie​

    ​ 請求頭中的值
  23. ​​IResponseCookiesFeature​​​: 控制如何應用到響應頭的 ​

    ​Set-Cookie​

    ​ 來控制響應 ​

    ​Cookie​

  24. ​​IServerVariablesFeature​​: 該特性提供通路伺服器變量的功能,例如通過 IIS 伺服器提供的變量。
  25. ​​IServiceProvidersFeature​​​: 提供通路使用作用域服務的 ​

    ​IServiceProvider​

    ​。與依賴注入相關
  26. ​​ISessionFeature​​​: 對于支援的使用者會話,定義了 ​

    ​ISessionFactory​

    ​ 和 ​

    ​ISession​

    ​ 抽象。​

    ​ISessionFeature​

    ​ 是通過 ​​SessionMiddleware 中間件​​ 所實作的 ( 見:​​ASP.NET Core 中的會話​​ )
  27. ​​ITlsConnectionFeature​​: 定義提取用戶端證書的 API
  28. ​​ITlsTokenBindingFeature​​: 定義操作 TLS 令牌綁定參數的 API
  29. ​​ITrackingConsentFeature​​: 用于查詢、授予和撤銷有關存儲與網站活動和功能相關的使用者資訊的使用者同意。

參考資料

  • ​​Kestrel Features​​
  • ​​IIS Features​​
  • [對比 ASP.NET Core 中的 HttpContext.Features 與 HttpContext.Items](對比 ASP.NET Core 中的 HttpContext.Features 與 HttpContext.Items)

繼續閱讀