ASP.NET-如何在上传大文件时显示错误页面(超出最大请求长度)?
应用程序可以在OnError中记录错误,但我们无法执行任何重定向,因此无法向用户显示有意义的内容。
有任何想法吗?
我知道我们可以在web.config中设置maxRequestLength,但是无论如何用户都可以超过此限制,并且需要显示一些正常错误。
解决方案
我们可以检查发布文件的长度(FileUpload.PostedFile.ContentLength),以查看发布文件的长度是否小于限制,并在必要时仅显示友好的错误消息。
我们应该能够在Global.asax OnError()处理程序中捕获该错误。
但是很遗憾,初始请求将完成,并且我们将无法通过向用户发送一些错误通知来呈现相同的上传页面。
我们最多可以做的是在OnError()处理程序中显示一个带有简单redirect子句的友好错误页面,并在该页面上显示一些反向链接或者类似功能,以使用户返回到第一个触发错误的页面地方。
更新:
最近我不得不对文件上传进行精确检查,而我想到的是SWFUpload库,它完全满足了我的要求,并且还具有许多其他功能。我将其与Steve Sanderson提供的jquery包装器一起使用。更多详细信息可以在这里找到。
关键是,闪存能够检测到客户端的文件大小,并且在遇到这种情况时可以做出适当的反应。我认为这正是我们所需要的。
此外,如果要在客户端未安装闪存的情况下优雅地降级为本机上载button0,则可以实施闪存检测检查。
不幸的是,我们可能将需要IIS7并使用自定义处理程序来捕获它,因为IIS6永远无法进入可以看到文件大小的阶段。上传完成或者出现错误时,它只能知道大小。
这是ASP.NET中的一个已知问题。另一个替代方案是在请求中更早地处理此问题,并可能使用基于Flash的上传器。 John链接到下面的几个链接。
更新:乔恩·加洛韦(Jon Galloway)似乎已经对这个问题进行了更深入的研究,并且似乎RIA上载器是唯一明智的选择,因为IIS似乎总是必须吞咽该文件,然后告诉我们它很大。
如我们所说,我们可以在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错误,此代码项目文章介绍了一种解决方案,解决了一个似乎非常相似的问题:重定向到自定义401页
谢尔盖
根据JohnIdol的回答,我们需要为413状态码设置一个自定义错误页面。例如。:
<customErrors mode="On" defaultRedirect="~/Errors/Error.aspx"> <error statusCode="413" redirect="~/Errors/UploadError.aspx"/> </customErrors>
我知道,因为我必须在客户项目上解决相同的问题,而这正是对我有用的解决方案。不幸的是,这是我发现的唯一解决方案。例如,按照snomag的建议检查发布文件的长度,或者在global.asax中捕获错误。像我们一样,在提出可行的解决方案之前,我还尝试了其他方法。 (实际上,当我处理自己的问题时,我最终在网络上的某个地方找到了它)。
希望能有所帮助。