一尘不染

捕捉到“超出最大请求长度”

c#

我正在编写一个上载函数,并且遇到文件大于httpRuntimeweb.config中指定的最大大小(最大大小设置为5120)时,捕获“
System.Web.HttpException:最大请求长度超出”的问题。我正在使用一个简单<input>的文件。

问题是该异常在上载按钮的单击事件之前引发,并且该异常在我的代码运行之前发生。那么,如何捕获和处理异常?

编辑: 异常立即引发,所以我很确定这不是由于连接速度慢而引起的超时问题。


阅读 359

收藏
2020-05-19

共1个答案

一尘不染

不幸的是,没有简单的方法来捕获此类异常。我要做的是要么在页面级别覆盖OnError方法,要么在global.asax中覆盖Application_Error,然后检查它是否是最大请求失败,如果是,则转移到错误页面。

protected override void OnError(EventArgs e) .....


private void Application_Error(object sender, EventArgs e)
{
    if (GlobalHelper.IsMaxRequestExceededException(this.Server.GetLastError()))
    {
        this.Server.ClearError();
        this.Server.Transfer("~/error/UploadTooLarge.aspx");
    }
}

这是一个hack,但是下面的代码对我有用

const int TimedOutExceptionCode = -2147467259;
public static bool IsMaxRequestExceededException(Exception e)
{
    // unhandled errors = caught at global.ascx level
    // http exception = caught at page level

    Exception main;
    var unhandled = e as HttpUnhandledException;

    if (unhandled != null && unhandled.ErrorCode == TimedOutExceptionCode)
    {
        main = unhandled.InnerException;
    }
    else
    {
        main = e;
    }


    var http = main as HttpException;

    if (http != null && http.ErrorCode == TimedOutExceptionCode)
    {
        // hack: no real method of identifying if the error is max request exceeded as 
        // it is treated as a timeout exception
        if (http.StackTrace.Contains("GetEntireRawContent"))
        {
            // MAX REQUEST HAS BEEN EXCEEDED
            return true;
        }
    }

    return false;
}
2020-05-19