2012-10-05 34 views
2

可能重複:
Maximum Request Length Exceeded Not Redirect on Error Page重定向用戶另一頁上Page_Error事件

我嘗試用戶重定向到一些錯誤頁面,當他上傳文件超過最大容量。

我已經把在Web.config中下面一行到文件限制爲10MB:

<httpRuntime maxRequestLength="10240" executionTimeout="360" /> 

在我的網頁有一個簡單的標準ASP文件上傳控制表,並提交按鈕。 我也定義重定向頁面上水平(我也試過在Global.asax中的Application_Error處理,但結果是一樣的):

protected void Page_Error(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Error is HttpException) 
    { 
     if ((HttpContext.Current.Error as HttpException).ErrorCode==-2147467259) 
     { 
      Server.ClearError(); 
      Response.Redirect("~/Error.aspx"); 
     } 
    } 
} 

我試過也Server.Transfer() - 不工作。

當我嘗試上傳文件超過10 MB我可以調試和看到,從Page_Error代碼被完全執行了兩次較大的:即使Server.ClearError(),但頁面不重定向到Error.aspx。相反,標準,醜陋的「連接已重置」錯誤頁面出現。

如果錯誤是另一種類型,例如在Page_Load上設置0,則此代碼正常工作。你能告訴我我在這裏做錯了什麼嗎?

順便說一句。我使用Visual Web Developer 2010 Express與.NET 4.0,WindowsXP。在VWD IIS服務器上測試buld-in。

回答

0

答:
好吧,所以我找到的答案如下:它不能通過「正常」異常處理完成。如下因素代碼中提到的鏈接,把在Global.asax中的一個發現,是一些wokaround:

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    System.Web.Configuration.HttpRuntimeSection runTime = (System.Web.Configuration.HttpRuntimeSection)System.Web.Configuration.WebConfigurationManager.GetSection("system.web/httpRuntime"); 

    //Approx 100 Kb(for page content) size has been deducted because the maxRequestLength proprty is the page size, not only the file upload size 
    int maxRequestLength = (runTime.MaxRequestLength - 100) * 1024; 

    //This code is used to check the request length of the page and if the request length is greater than 

    //MaxRequestLength then retrun to the same page with extra query string value action=exception 

    HttpContext context = ((HttpApplication)sender).Context; 
    if (context.Request.ContentLength > maxRequestLength) 
    { 
     IServiceProvider provider = (IServiceProvider)context; 
     HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); 

     // Check if body contains data 
     if (workerRequest.HasEntityBody()) 
     { 
      // get the total body length 
      int requestLength = workerRequest.GetTotalEntityBodyLength(); 

      // Get the initial bytes loaded 
      int initialBytes = 0; 

      if (workerRequest.GetPreloadedEntityBody() != null) 
       initialBytes = workerRequest.GetPreloadedEntityBody().Length; 

      if (!workerRequest.IsEntireEntityBodyIsPreloaded()) 
      { 
       byte[] buffer = new byte[512000]; 

       // Set the received bytes to initial bytes before start reading 
       int receivedBytes = initialBytes; 

       while (requestLength - receivedBytes >= initialBytes) 
       { 
        // Read another set of bytes 
        initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length); 

        // Update the received bytes 
        receivedBytes += initialBytes; 
       } 
       initialBytes = workerRequest.ReadEntityBody(buffer, requestLength - receivedBytes); 
      } 
     } 

     context.Server.ClearError(); //otherwise redirect will not work as expected 
     // Redirect the user 
     context.Response.Redirect("~/Error.aspx"); 
    } 
} 
1

你可能要嘗試定義的一般錯誤頁面在你的web.config文件,而不是通過代碼處理它:

<customErrors defaultRedirect="/Path/to/myErrorPage.aspx" mode="On" /> 

然後你也可以定義每個HTTP狀態代碼的特定頁面,如:

<customErrors defaultRedirect="/error/generic.aspx" mode="On"> 
    <error statusCode="404" redirect="/error/filenotfound.aspx" /> 
    <error statusCode="500" redirect="/error/server.html" /> 
</customErrors> 

這裏有一個像樣的how-to文章:http://support.microsoft.com/kb/306355

編輯:我已經張貼了一個可疑副本。在你的問題的評論中查看它。它看起來與你的非常相似。也許asp.net有問題處理這些類型的錯誤..

編輯2:還 - 我相信你正在嘗試處理錯誤是http 413

<error statusCode="413" redirect="/error/upload.aspx"/> 
+0

是的,我忘了提,我也嘗試過那個,而且它不改變我的任何問題.. 。 – mj82