我們以為的文件大小限制
我們大家都知道ASP.NET為我們提供了文件上傳服務器控件FileUpload,默認情況下可上傳的最大文件為4M,如果要改變可上傳文件大小限制,那么我們可以在web.config中的httpRuntime元素中添加maxRequestLength屬性設置大小,同時為了支持大文件上傳超時可以添加executionTimeout屬性設置超時時間。網上有很多這樣的例子,但實際情況是否是這樣嗎?
<httpRuntime maxRequestLength="" executionTimeout=""/>
測試環境
IIS 7.5、.NET 3.5 sp1
測試頁面UploadFile.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="UploadFile.aspx.cs" Inherits="UploadFile" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID="Button1" runat="server" Text="Button" /> </div> </form> </body> </html>
測試頁面UploadFile.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class UploadFile : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (FileUpload1.FileContent != null) { FileUpload1.SaveAs(Server.MapPath("/Files/"+FileUpload1.FileName)); } } }
實際測試
- 上傳小於4M的文件
選擇2.7M的pdf文件上傳
上傳提示成功
2. 上傳大於4M的文件
選擇上傳4.3M的pdf文件
上傳后報黃頁
3. 修改web.config文件,設置可上傳文件大小限制
修改web.config,增大可上傳文件的大小限制,增大執行時間限制
<httpRuntime maxRequestLength="2048000" executionTimeout="600"/>
重新選擇剛才4.3M的pdf文件,重新上傳
上傳成功
4. 上傳大於30M的的文件
碰到這個問題的實際環境是我們使用了第三方的上傳文件組件,通過js調用第三方的ActiveX控件上傳文件,修改web.config后上傳大於30M的文件的時候,報了
如下錯誤
查看windows系統日志,可以看到如下的日志錯誤,看到異常信息,我們可以猜測到是請求超長,但是我們設置了最大請求長度了啊,而且遠遠要大於30M。靜
下來想一想可能是IIS限制的,查詢相關的IIS資料,發現果然是這樣。
異常消息: 超過了最大請求長度。
在 System.Web.HttpRequest.GetEntireRawContent()
在 System.Web.HttpRequest.GetMultipartContent()
在 System.Web.HttpRequest.FillInFormCollection()
在 System.Web.HttpRequest.EnsureForm()
在 System.Web.HttpRequest.get_HasForm()
在 System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
在 System.Web.UI.Page.DeterminePostBackMode()
在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
5. 修改IIS的配置
選中自己的站點,並雙擊“請求篩選”
選擇右側的”編輯功能限制”
在彈出的頁面中,我們看到默認請求限制正是30M
修改請求大小限制為合適的值即可,保存后重啟站點即可。
總結
1. Asp.NET作為微軟的Web服務框架,其定義了web請求的大小限制和執行時間限制。同時其為上傳文件提供了基礎的框架,並為我們提供了UploadFile服務器控
件,其最終也是通過Http將文件數據傳輸到服務器端,自然也受請求大小和執行時間的限制,只是一般的請求都打不到這個極限,往往是上傳文件的時候才會觸及
這個閥值。
2. IIS作為windows平台上承載ASP.NET的法定服務器,按照正常邏輯來說,其也能統一設置發送到自己這里請求的大小限制。同時由於IIS只將針對特定類型的文
件的請求路由到ASP.NET進行處理,像js、css和圖片等請求是不受ASP.NET中請求大小的限制的,這也從一個側面說明有必要再IIS中添加控制。
3. 請求的長度校驗只有先通過IIS的限制后,才有可能路由到ASP.NET,只有最終通過ASP.NET的長度限制校驗,才能正常的進行后續的管道處理步驟。