重定向应用程序级错误处理程序

时间:2010-01-28 19:32:11

标签: c# asp.net

protected void Application_BeginRequest(object sender, EventArgs e)
    {


        const int maxFileSizeKBytes = 10240; //10 MB
        const int maxRequestSizeKBytes = 305200; //~298 MB

        if (Request.ContentLength > (maxRequestSizeKBytes * 1024))
        {
            Response.Redirect(".aspx?requestSize=" + Request.ContentLength.ToString());
        }


        for (int i = 0; i < Request.Files.Count; i++)
        {
            if (Request.Files[i].ContentLength > (maxFileSizeKBytes * 1024))
            {
                Response.Redirect(".aspx?fileSize=" + Request.Files[i].ContentLength.ToString());
            }
        }

    }

此代码位于Global.asax.cs页面中。 我需要重定向到触发此检查的页面。我需要知道ticketId或projectId参数。例如,我在View Project页面/Project/ViewProject.aspx?projectId=1创建新票证我需要向用户重定向到该页面,并向用户发送有意义的消息,因为我认为重定向到另一个页面以显示错误消息并不是一个好主意。

4 个答案:

答案 0 :(得分:1)

为什么不将这些检查放在ViewProject(以及需要检查的任何其他内容)派生自的基页类的Load处理程序中?然后,如果检查失败,您可以只显示错误标签。未经测试的代码:

public class BasePage : Page{
  protected virtual Label ErrorLabel { get; set; };
  protected override OnLoad(object sender, EventArgs e) {
    base.OnLoad(sender, e);

    const int maxFileSizeKBytes = 10240; //10 MB
    const int maxRequestSizeKBytes = 305200; //~298 MB

    if (Request.ContentLength > (maxRequestSizeKBytes * 1024))
    {
        ErrorLabel.Text = "Request length "+Request.ContentLength+" was too long."
        ErrorLabel.Visible = true;
    }


    for (int i = 0; i < Request.Files.Count; i++)
    {
        if (Request.Files[i].ContentLength > (maxFileSizeKBytes * 1024))
        {
            ErrorLabel.Text = "File length "+ Request.Files[i].ContentLength +" was too long."
            ErrorLabel.Visible = true;
        }
    }
  }
}

public class ViewProject : BasePage {
  protected override Label ErrorLabel {
    get { return LocalErrorLabel; } // something defined in HTML template
    set { throw new NotSupportedException(); }
  }
}

这样你就可以在同一页面上拥有ticketId和projectId。

答案 1 :(得分:1)

要处理global.asax文件中的应用程序错误,您应该考虑使用为此目的设计的处理程序:

protected void Application_Error(object sender, EventArgs e)
{
    //get exception causing event
    Exception lastException = Server.GetLastError().GetBaseException();

    //log exception, redirect based on exception that occurred, etc.
}

应使用MaxRequestLength property

在web.config中定义maxRequestSizeKBytes等“设置”

示例:

<system.web>
    <httpRuntime maxRequestLength="305200" executionTimeout="120" />
</system.web>

答案 2 :(得分:0)

你可以尝试使用Server.Transfer这样的东西。 URL将保持不变。做一个Response.Redirect会再次向同一个页面发送一个302(有时可能会在无限循环中发送你。例如,在mypage.aspx的页面加载中尝试使用Response.Redirect(mypage.aspx))。

 string errorPage = "~//Error.aspx";
 Server.Transfer(errorPage, false);    
 HttpContext.Current.Server.ClearError();
 HttpContext.Current.Response.ClearContent();

在任何一种情况下,您都应该将第二个参数设置为false以避免线程中止异常。恩。

Response.Redirect("mypage.aspx",false); 
Server.Transfer("myerror.aspx",false);

答案 3 :(得分:0)

这些限制实际上限制在web.config中作为最佳做法,以防止人们在您的网站上执行DoS。您可能最好为用户提供有关文件大小限制的视觉提示,然后让标准错误处理程序接管。

http://msdn.microsoft.com/en-us/library/e1f13641.aspx

向用户提供错误详细信息并不是一个好主意;你应该保留为管理员。文件大小错误只是......错误,与验证无关,这是您应该向用户提供反馈的。