ASP.NET Core中調(diào)整HTTP請求大小的幾種方法詳解
一、前言
之所以稱ASP.NET Core是一個Web開發(fā)平臺,源于它具有一個極具擴展性的請求處理管道,我們可以通過這個管道的定制來滿足各種場景下的HTTP處理需求。ASP. NET Core應用的很多特性,比如路由、認證、會話、緩存等,也同時定制消息處理管道來實現(xiàn)的。我們甚至可以通過管道定制在ASP.NET Core平臺上創(chuàng)建我們自己的Web框架,實際上MVC和SingalR這兩個重要的Web框架也是采用這樣的方式創(chuàng)建的。
HTTP協(xié)議自身的特性決定了任何一個Web應用的工作方式都是監(jiān)聽、接收并處理HTTP請求,并在最終對請求予以響應,HTTP請求處理是管道式設(shè)計典型的應用場景。我們根據(jù)HTTP請求的處理流程定制出一個消息處理管道,讓接收到的HTTP請求消息想水一樣流入這個管道,組成這個管道的各個環(huán)節(jié)一次對它作相應的處理。處理的結(jié)果同樣轉(zhuǎn)變成消息逆向流入這個管道進行處理,并最終轉(zhuǎn)變成回復給客戶端的HTTP響應。
一般的情況下,我們都無需調(diào)用HTTP請求的大小,只有在上傳一些大文件,或者使用HTTP協(xié)議寫入較大的值時(如調(diào)用WebService)才可能會調(diào)用HTTP最大請求值。
在ASP.NET Core 2.0中,它的兩個宿主服務器Kestrel和HttpSys默認的HTTP最大請求大小為30MB (~28.6 MiB)。
如果當HTTP請求值大于這個默認配置時,在執(zhí)行Request.Body.ReadAsync方法時,就會引發(fā)IOException異常。如果這個異常未被捕獲,在Kestrel服務器中輸出HTTP狀態(tài)碼413(Request Entity Too Large), 而在HttpSys 中的HTTP狀態(tài)碼將是500(Internal Server Error)。
二、解決方案
在ASP.NET Core中這個配置可以基于全局和每次請求進行配置。
1.MVC的解決方案
MVC Core中為我們提供了兩種特性配置請求大?。?/p>
RequestSizeLimit Attribute,對每個Action的請求大小進行配置。如下調(diào)整MyAction的請求大小值為100,000,000 字節(jié).
[HttpPost]
[RequestSizeLimit(100_000_000)]
public IActionResult MyAction([FromBody] MyViewModel data)
{
}
DisableRequestSizeLimit Attribute可以同時應用到Controller和Action上,以禁用對HTTP請求的大小限制,也是說設(shè)置為無限制。
[HttpPost]
[DisableRequestSizeLimit]
public IActionResult MyAction([FromBody] MyViewModel data)
{
}
2.請求上下文的解決方案
這個方案是一個全局配置方案,會影響到每個請求,當然也可以通過一些靈活的配置對單個請求進行修改,它通過IHttpMaxRequestBodySizeFeature 特征進行配置。如下在HttpContext中取得,當然也可以在ApplicationServices的IOC中獲取。
HttpContext.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = 100_000_000;
IHttpMaxRequestBodySizeFeature特征的MaxRequestBodySize屬性是Nullable< long >類型,當設(shè)置為null時,類擬于MVC中的[DisableRequestSizeLimit]]。IsReadOnly屬性說明此時上下文中的請求大小是否可以修改。
3.全局配置解決方案
通過兩個宿主服務器Kestrel和HttpSys配置對請求大小進行修改,規(guī)則與前兩種方案相同。
.UseKestrel(options =>
{
options.Limits.MaxRequestBodySize = null;
}
.UseHttpSys(options =>
{
options.MaxRequestBodySize = 100_000_000;
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
MVC+EasyUI+三層新聞網(wǎng)站建立 tabs標簽制作方法(六)
這篇文章主要為大家詳細介紹了MVC+EasyUI+三層新聞網(wǎng)站建立的第六篇,教大家如何制作tabs標簽,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
理解ASP.NET Core 中間件(Middleware)
這篇文章主要介紹了ASP.NET Core 中間件(Middleware),中間件是一種裝配到應用管道以處理請求和響應的軟件。文中講解相關(guān)知識非常詳細,感興趣的朋友可以一起來看一看2021-09-09
利用AJAX與數(shù)據(jù)島實現(xiàn)無刷新綁定
利用AJAX與數(shù)據(jù)島實現(xiàn)無刷新綁定...2007-03-03
基于.NET8實現(xiàn)WinFrom應用窗口自動縮放功能
這篇文章主要為大家詳細介紹了如何基于.net8 WinFrom實現(xiàn)應用窗口自動縮放功能,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下2025-01-01
asp.net Repeater取得CheckBox選中的某行某個值
Repeater取得CheckBox選中的某行某個值的實現(xiàn)代碼2008-07-07
ASP.Net 圖片存入數(shù)據(jù)庫的實現(xiàn)代碼
在很多時候,我們有這樣的需求:把圖片存入到數(shù)據(jù)庫當中。在一些應用程序中,我們可能有一些敏感的資料,由于存儲在文件系統(tǒng)(file system)中的東西,將很容易被某些用戶盜取,所以這些數(shù)據(jù)不能存放在文件系統(tǒng)中。2008-11-11

