ASP.NET Core中如何調整HTTP請求大小的幾種方式


一、前言

一般的情況下,我們都無需調用HTTP請求的大小,只有在上傳一些大文件,或者使用HTTP協議寫入較大的值時(如調用WebService)才可能會調用HTTP最大請求值。

在ASP.NET Core 2.0中,它的兩個宿主服務器Kestrel和HttpSys默認的HTTP最大請求大小為30MB (~28.6 MiB)。

如果當HTTP請求值大於這個默認配置時,在執行Request.Body.ReadAsync方法時,就會引發IOException異常。如果這個異常未被捕獲,在Kestrel服務器中輸出HTTP狀態碼413(Request Entity Too Large), 而在HttpSys 中的HTTP狀態碼將是500(Internal Server Error)。

二、解決方案

在ASP.NET Core中這個配置可以基於全局和每次請求進行配置。

1.MVC的解決方案

MVC Core中為我們提供了兩種特性配置請求大小:

RequestSizeLimit Attribute,對每個Action的請求大小進行配置。如下調整MyAction的請求大小值為100,000,000 字節.

[HttpPost]
[RequestSizeLimit(100_000_000)]
public IActionResult MyAction([FromBody] MyViewModel data)
{
}

DisableRequestSizeLimit Attribute可以同時應用到ControllerAction上,以禁用對HTTP請求的大小限制,也是說設置為無限制。

[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 >類型,當設置為null時,類擬於MVC中的[DisableRequestSizeLimit]]IsReadOnly屬性說明此時上下文中的請求大小是否可以修改。

3.全局配置解決方案

通過兩個宿主服務器Kestrel和HttpSys配置對請求大小進行修改,規則與前兩種方案相同。

.UseKestrel(options =>
{
    options.Limits.MaxRequestBodySize = null;
}
.UseHttpSys(options =>
{
    options.MaxRequestBodySize = 100_000_000;
}

推廣

GitHub:https://github.com/maxzhang1985/YOYOFx 如果覺還可以請Star下, 歡迎一起交流。

.NET Core 開源學習群:214741894


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM