【问题标题】:ASP.NET - how to show a error page when uploading big file (Maximum request length exceeded)?ASP.NET - 上传大文件时如何显示错误页面(超出最大请求长度)?
【发布时间】:2008-09-24 09:15:28
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    正如您所说,您可以在 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

    【讨论】:

    • 谢谢,这是关于处理错误的完整指南,我最终得到了完全相同的 xml。但是,当超出请求长度时,这无济于事。
    • 对于那些来到这个页面并且不知道如何设置maxRequestLength的人:MSDN
    【解决方案2】:

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

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

    更新:Jon Galloway 似乎有 looked deeper into this problem,而且似乎 RIA 上传器是唯一明智的选择,因为 IIS 似乎总是不得不吞下文件,然后告诉你它是变大。

    【讨论】:

    • 我们的服务器运行 IIS7,你能提供一些链接/关键字在哪里寻找答案如何解决这个问题?
    【解决方案3】:

    谢尔盖,

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

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

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

    希望对您有所帮助。

    【讨论】:

    • 奇怪,“超出最大请求长度”时出现错误 500。
    【解决方案4】:

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

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

    更新:

    我最近必须对文件上传进行精确检查,我想出的是SWFUpload 库,它完全符合我的要求并且还有很多附加功能。我将它与 Steve Sanderson 提供的 jquery 包装器一起使用。更多详情请见here

    关键是,闪存能够在客户端检测文件大小并在遇到这种情况时做出正确反应。我认为这正是您所需要的。

    此外,如果您想在客户端未安装 flash 的情况下优雅地降级为原生上传 button0,您可以实施 flash 检测检查。

    【讨论】:

    • 没错,我可以在 OnError 中捕获异常,但是 Response.Redirect() 什么也不做。
    【解决方案5】:

    处理大型上传的最佳方法是使用实​​现 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

    【讨论】:

      【解决方案6】:

      您可以检查张贴文件的长度 (FileUpload.PostedFile.ContentLength),看看它是否低于限制,并在必要时简单地显示一条友好的错误消息。

      【讨论】:

      • 好吧,这对我来说是新的,我认为您可以先检查内容长度,然后再决定上传文件/拒绝它。
      • 感谢您提供的信息,我刚刚检查了一下,但确实失败了。很高兴知道,因为我以前使用过它,但没有意识到它有问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多