處理“System.Web.HttpException: 超過了最大請求長度”


在通常(不局限於此)在上傳文件大於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();
            }
        }

 


免責聲明!

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



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