在通常(不局限於此)在上傳文件大於ASP.NET默認的4M 或 Web.config 的的配置時會拋出此異常;
Web.config 配置:
<configuration> <system.web> <httpRuntime maxRequestLength="4096" executionTimeout="3600" /> </system.web> <configuration>
如果光是調整Web.config的 maxRequestLength 是治標不治本的。
今天研究了下在網上找到一個方法,代碼大致如下:
Global.asax.cs
需要多引入命名空間
Using System.Web.Configuration; void Application_BeginRequest(object sender, EventArgs e) { //本代碼的功能是檢查頁面請求的大小,如果超過了配置文件maxRequestLength的設定值,就提示用戶超過了所允許的文件大小。 //從配置文件里得到配置的允許上傳的文件大小 HttpRuntimeSection runTime = (HttpRuntimeSection)WebConfigurationManager.GetSection("system.web/httpRuntime"); //maxRequestLength 為整個頁面的大小,不僅僅是上傳文件的大小,所以扣除 100KB 的大小, //maxRequestLength單位為KB int maxRequestLength = (runTime.MaxRequestLength) * 1024; //當前請求上下文的HttpApplication實例 //HttpContext context = ((HttpApplication)sender).Context; //判斷請求的內容長度是否超過了設置的字節數 if (Request.ContentLength > maxRequestLength) { #region 不理解這些代碼存在的意義 /* //得到服務對象 IServiceProvider provider = (IServiceProvider)context; HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); //檢查請求是否包含正文數據 if (workerRequest.HasEntityBody()) { //請求正文數據的長度 int requestLength = workerRequest.GetTotalEntityBodyLength(); //得到加載的初始字節數 int initialBytes = 0; if (workerRequest.GetPreloadedEntityBody() != null) initialBytes = workerRequest.GetPreloadedEntityBody().Length; //檢查是否所有請求數據可用 if (!workerRequest.IsEntireEntityBodyIsPreloaded()) { byte[] buffer = new byte[512000]; //設置要接收的字節數為初始字節數 int receivedBytes = initialBytes; //讀取數據,並把所有讀取的字節數加起來,判斷總的大小 while (requestLength - receivedBytes >= initialBytes) { //讀取下一塊字節 initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length); //更新接收到的字節數 receivedBytes += initialBytes; } initialBytes = workerRequest.ReadEntityBody(buffer, requestLength - receivedBytes); } } */ #endregion //注意這里可以跳轉,可以直接終止;在VS里調試時候得不到想要的結果,通過IIS才能得到想要的結果;FW4.0經典或集成都沒問題 Response.Write("請求大小" + Request.ContentLength); Response.End(); } }
