如何在ASP.NetCore增加文件上传大小
關注架構師高級俱樂部
開啟架構之路
不定期福利發(fā)放哦~
架構師高級俱樂部
讀完需要
7
分鐘速讀僅需 3 分鐘
/ 如何在核心中增加文件 ASP.NET 大小 /
從ASP.NET 2.0開始最大請求正文大小限制為30MB (+28.6 MiB)。在正常情況下,無需增加 HTTP 請求 body 的大小。但是,當您嘗試上傳大型文件 (> 30MB) 時,需要增加默認允許的最大限制。在這篇簡短的文章中,我們將了解如何在.netcore 應用程序中增加文件 ASP.NET 大小以及控制此限制的各種選項。
1
? ?
在核心中增加文件 ASP.NET 大小
正如我們所知 ASP.NET 是獨立于平臺的,因此您可以在 Windows、Linux 或 Mac 平臺上托管它們。換句話說,您可以在 IIS、Ngnix 和 Apache Web 服務器上托管應用程序。Kestrel 是用于 asp.netcore 的跨平臺的服務器,默認情況下包含在 netcore ASP.NET 中。Kestrel 可用作獨立服務器或被其他服務器反向代理,如 IIS、Nginx 或 Apache。沒有單一的解決方案可以覆蓋所有的部署選項來增加請求大小限制。根據(jù)不同的部署選項,解決方案也不盡相同。我們可能有以下部署選項。
1、托管在 IIS 上(有凱斯特雷爾或沒有凱斯特雷爾)
2、托管在 Kestrel 上(作為獨立或與 Ngnix 和 Apache 服務器一起托管)
2
? ?
在 IIS 上
還能記得在 ASP.NET 中,我們曾經(jīng)在 web.config 文件中通過設置增加 4MB 的默認限制。就像 maxRequestLength 節(jié)點
<configuration><system.web><httpRuntime maxRequestLength="xxx" /></system.web> </configuration>同樣對于 ASP.NetCore 應用程序我們可以通過在文件設置中設置屬性來增加默認的 30MB 的限制。默認的 ASP。NET Core 應用模板沒有創(chuàng)建此文件。它在發(fā)布應用程序時創(chuàng)建。但是,您也可以使用以下代碼將其手工添加(如果沒有)到應用程序的根目錄maxAllowedContentLengthweb.configweb.config
`<?xml version="1.0" encoding="utf-8"?> `<?xml version="1.0" encoding="utf-8"?> <configuration><!-- To customize the asp.net core module uncomment and edit the following p. For more info see https://go.microsoft.com/fwlink/?linkid=838655 --><system.webServer><handlers><remove name="aspNetCore"/><add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/></handlers><aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /><security><requestFiltering><!-- This will handle requests up to 50MB --><requestLimits maxAllowedContentLength="52428800" /></requestFiltering></security></system.webServer> </configuration>您需要在 security 部分中進行定義。更多詳情可百度maxAllowedContentLengthweb.config為了在 IIS 和 Kestrel 服務器之間創(chuàng)建反向代理,web.config 文件必須出現(xiàn)在已部署應用程序的內(nèi)容根路徑(通常是應用程序 basepath)。這是提供給 IIS 的網(wǎng)站物理路徑的相同位置。此設置僅適用于 IIS。
3
? ?
托管在 Kestrel 上
從 ASP.NET Core 2.0 開始, Kestrel 服務器也強加了自己的默認限制。有 3 種不同的方法可以增加這個默認限制。
3.1
? ?
MVC 解決方案
如果你想改動一個特定的 MVC 接口或控制器的最大請求體大小限制,你可以使用屬性。比如 RequestSizeLimit
[HttpPost][RequestSizeLimit(40000000)] public async Task<IActionResult> UploadFiles(IFormFile file){ //TODO: Save file }該 RequestSizeLimit 操作方法設置允許的最大請求長度。您可以在方法級別或控制器級別應用此屬性。這是 ASP.netcore 應用中增加請求體最大限制的推薦方法。還有另一個適用于控制器級別或方法級別的屬性來禁用 HTTP 請求的大小限制。這將把請求限制設置為無限制。比如, ableRequestSizeLimit
[HttpPost] [DisableRequestSizeLimit] public async Task<IActionResult> UploadFiles(IFormFile file){ //TODO: Save file }3.2
? ?
全局方案
要修改全局最大請求 body 大小,請為 Kestrel 設置選項。比如,MaxRequestBodySize
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>?WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() .UseKestrel(options?=>? {?options.Limits.MaxRequestBodySize?=?52428800;?//50MB?});?}這適用于整個應用程序的任何請求。該值是一個可空的長值。將它設置為 null 會禁用該限制。現(xiàn)在你可能會想,為什么這對 windows 不起作用,因為 IIS 也使用 Kestrel。原因是,這個設置對于運行在 IIS 后面的 Kestrel 來說是無效的,在 IIS 后面應用的是正常的 web.config 限制。雖然這是一個全局設置,但它可以通過中間件.MaxRequestBodySize 來覆蓋每個請求。
3.3
? ?
中間件方案
如果你想基于請求覆蓋全局設置,你可以通過中間件來實現(xiàn)。這樣你就可以通過一些靈活的配置來修改單個請求。比如
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => { context.Features.Get<IHttpMaxRequestBodySizeFeature>() .MaxRequestBodySize = null; //TODO: take next steps });請記住,在讀取請求體開始后,不能更改。如果你在應用開始讀取請求后試圖配置請求的限制,會拋出一個異常。有一個屬性可以指示是否處于只讀狀態(tài),也就是說來不及配置限制了。IsReadOnlyMaxRequestBodySize(只讀最大請求體大小)
4
? ?
概要
綜上所述,本帖提供了增加 ASP.NET Core 應用的請求限制大小的解決方案,涵蓋了所有可能的部署方案。根據(jù)你的部署模式,你需要進行配置修改。不過,不管是哪種部署方案,如果有一個增加請求限制的單一解決方案,那將是最理想的。
總結
以上是生活随笔為你收集整理的如何在ASP.NetCore增加文件上传大小的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BCVP第2期:项目已完成升级.NET5
- 下一篇: 一个 Task 不够,又来一个 Valu