如何优雅地处理maxRequestLength异常?

时间:2010-06-09 16:19:54

标签: asp.net-mvc web-config

在我的ASP.NET MVC(v2,如果它很重要)应用程序中,我有一个允许用户上传文件的页面。我为我的应用配置了maxRequestLength,允许最大25MB的文件。作为测试,我发送一个500MB的文件,抛出异常:Maximum request length exceeded.(我只知道这个,因为ELMAH捕获错误并记录它。)

在我的web.config中,我已将customErrors mode="On"设置为defaultRedirect,但用户根本没有重定向,他们甚至没有获得黄色死亡屏幕。例如,在Chrome中,您会看到错误:Error 101 (net::ERR_CONNECTION_RESET): Unknown error.

是否有可能为这种情况提供更优雅的用户体验?

3 个答案:

答案 0 :(得分:4)

据我所知,没有办法优雅地处理超过IIS的“maxRequestLength”设置。它甚至无法显示自定义错误页面(因为没有相应的HTTP代码可以响应)。解决这个问题的唯一方法是将maxRequestLength设置为一些荒谬的高kbytes,例如51200(50MB),然后在上传文件后检查ContentLength(假设请求在90秒之前没有超时)。此时,我可以验证文件< = 5MB并显示友好错误。

答案 1 :(得分:2)

答案 2 :(得分:0)

如果所选文件超过最大请求长度,我通过使页面无效(因此它不会回发)解决了这个问题。它需要为客户端提供自定义验证控件,验证fileupload控件。 这是服务器验证子,用于将文件大小限制为4Mb:

Sub custvalFileSize_ServerValidate(ByVal s As Object, ByVal e As ServerValidateEventArgs)
        'FileUpload1 size has to be under 4Mb
        If (FileUpload1.PostedFile.ContentLength > 4194304) Then
            e.IsValid = False
        Else
            e.IsValid = True
        End If
End Sub

这是客户端验证功能:

function custvalFileSize_ClientValidate(src,args){
    if (document.all("FileUpload1").files[0].size > 4194304){
        args.IsValid = false;
    } else {
        args.IsValid = true;
    }
}

上传控制和验证控件:

<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:CustomValidator ID="CustomValidator1" runat="server" BackColor="#FFFFFF" BorderColor="#FF0000"                                BorderStyle="solid" BorderWidth="0" ClientValidationFunction="custvalFileSize_ClientValidate"                    ControlToValidate="FileUpload1" Display="Dynamic" EnableClientScript="true" ErrorMessage="<b>Please upload document files of 4Mb or less.</b>"
Font-Bold="false" Font-Names="Verdana, Arial, Helvetica" Font-Size="9px" ForeColor="#FF0000"                              OnServerValidate="custvalFileSize_ServerValidate" Text="<br/><span style='font-weight:bold;font-size:12px;'>This file is too large.<br />We can only accept documents of 4Mb or less.</span>"></asp:CustomValidator>