ASP.NET - 如何在上传大文件时显示错误页面(超出最大请求长度)?

时间:2008-09-24 09:15:28

标签: .net asp.net file-upload maxrequestlength application-onerror

应用程序能够在OnError中记录错误,但我们无法进行任何重定向,因此无法向用户显示有意义的内容。 有任何想法吗? 我知道我们可以在web.config中设置maxRequestLength,但无论如何用户都可以超过这个限制,并且需要显示一些正常的错误。

6 个答案:

答案 0 :(得分:6)

正如您所说,您可以在web.config中设置maxRequestLength(覆盖您的machine.config的默认4MB),如果超出此限制,您通常会收到HTTP 401.1错误。

为了在应用程序级别处理通用HTTP错误,您可以在system.web部分的web.config中设置CustomError部分:

<system.web>
   <customErrors mode=On defaultRedirect=yourCustomErrorPage.aspx />
</system.web>

每次显示错误时,用户都将被重定向到您的自定义错误页面。

如果您想为每个错误设置专门的页面,您可以执行以下操作:

<system.web>    
   <customErrors mode="On" defaultRedirect="yourCustomErrorPage.aspx">
     <error statusCode="404" redirect="PageNotFound.aspx" />
   </customErrors>
</system.web>

等等。

或者,您可以从IIS编辑虚拟目录属性的CustomErrors选项卡,以指向您选择的错误处理页面。

以上似乎不适用于401.x错误 - 这篇代码项目文章解释了一个似乎非常类似问题的解决方法:Redirecting to custom 401 page

答案 1 :(得分:1)

不幸的是,您可能需要IIS7并使用自定义处理程序捕获它,因为IIS6永远不会到达可以查看文件大小的阶段。只有在完成上传或出错时才能知道大小。

这是ASP.NET中的一个已知问题。另一个(蹩脚的)替代方案是在请求中更早地处理这个问题,并且可能使用基于闪存的上传器。 John链接到以下几个链接

更新:Jon Galloway似乎有looked deeper into this problem,看起来像RIA-uploader是唯一明智的选择,因为IIS似乎总是要吞下文件然后告诉你它很大。

答案 2 :(得分:1)

谢尔盖,

根据JohnIdol的回答,您需要为 413 状态代码设置自定义错误页面。 e.g:

    <customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
                    <error statusCode="413" redirect="~/Errors/UploadError.aspx"/>
    </customErrors>

我知道因为我必须在客户端项目中解决同样的问题,这是对我有用的解决方案。不幸的是,这是我发现的唯一解决方案......在代码中无法捕捉到这个特殊问题;例如,以snomag建议的方式检查已发布文件的长度,或者在global.asax中捕获错误。和你一样,在我提出一个有效的解决方案之前,我也尝试过其他方法。 (实际上,当我处理我的问题时,我最终在网上找到了这个。)

希望有所帮助。

答案 3 :(得分:0)

您应该能够捕获Global.asax - OnError()处理程序中的错误。 但遗憾的是,您的初始请求将完成,您将无法向用户呈现相同的上载页面并显示一些错误通知。

你最多可以做的是在OnError()处理程序和该页面上显示带有简单重定向子句的友好错误页面,以便有一些反向链接或类似功能将用户返回到他触发错误的页面首先。

更新:

我最近必须对文件上传进行精确检查,我想出的是SWFUpload库,它完全符合我的要求,还有很多其他功能。我将它与Steve Sanderson提供的jquery包装一起使用。可以找到更多详细信息here

关键是,flash能够在客户端检测文件大小,并在满足此情况下做出正确反应。我认为这正是你所需要的。

此外,如果您希望在客户端未安装闪存的情况下优雅地降级到本机上传按钮0,则可以实施闪存检测检查。

答案 4 :(得分:0)

处理大型上传的最佳方法是使用实​​现HttpModule的解决方案,该文件将文件分解为块。任何预先滚动的解决方案都应该允许您限制文件大小。很多其他人已发布链接到此页面上的链接,所以我不会打扰。 但是,如果您不想打扰,可以在应用程序的Global.asax Application_Error事件中处理此问题。如果您的应用程序是.NET 4.0,请在此处粘贴此代码块:

    if (ex.InnerException != null && ex.InnerException.GetType() == typeof(HttpException) && ((HttpException)ex.InnerException).WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //Handle and redirect here, you can use Server.ClearError() and Response.Redirect("FileTooBig.aspx") or whatever you choose
    }

来源:http://justinyue.wordpress.com/2010/10/29/handle-the-maximum-request-length-exceeded-error-for-asyncfileupload-control/

如果你在早期的框架上运行,请尝试这里的代码(它在VB中,但很容易翻译):http://www.webdeveloper.com/forum/showthread.php?t=52132

答案 5 :(得分:-1)

您可以检查已发布文件的长度(FileUpload.PostedFile.ContentLength),看它是否低于限制,并在必要时显示友好的错误消息。