应用程序能够在 OnError 中记录错误,但我们无法进行任何重定向或向用户显示有意义的内容。有任何想法吗?我知道我们可以在 web.config 中设置 maxRequestLength,但是无论如何用户可以超过这个限制并且需要显示一些正常的错误。
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 错误 - 这篇代码项目文章解释了一个似乎非常相似的问题的解决方法:重定向到自定义 401 页面
不幸的是,您可能需要 IIS7 并使用自定义处理程序来捕获它,因为 IIS6 永远不会到达它可以看到文件大小的阶段。它只有在上传完成或出现错误时才能知道大小。
这是 ASP.NET 中的一个已知问题。另一种(蹩脚的)替代方案是在请求的早期处理这个问题,并且可能使用基于 Flash 的上传器。约翰链接到以下链接中的几个。
更新: Jon Galloway 似乎已经深入研究了这个问题,似乎 RIA 上传器是唯一明智的选择,因为 IIS 似乎总是不得不吞下文件然后告诉你它太大了。
谢尔盖,
根据 JohnIdol 的回答,您需要为413状态码设置自定义错误页面。例如:
<customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
<error statusCode="413" redirect="~/Errors/UploadError.aspx"/>
</customErrors>
我知道是因为我必须在客户项目中解决同样的问题,而这对我来说是有效的解决方案。不幸的是,这是我找到的唯一解决方案……无法在代码中捕捉到这个特殊问题;例如,按照 snomag 的建议检查发布文件的长度,或者在 global.asax 中发现错误。和你一样,在想出一个可行的解决方案之前,我也尝试过这些其他方法。(实际上,当我解决我的问题时,我最终在网络上的某个地方找到了这个)。
希望有帮助。
您应该能够在 Global.asax - OnError() 处理程序中捕获错误。但不幸的是,您的初始请求将完成,您将无法向用户呈现带有一些错误通知的相同上传页面。
您最多可以做的是在 OnError() 处理程序中显示一个带有简单重定向子句的友好错误页面,并在该页面上具有一些反向链接或类似功能,以将用户返回到他第一次触发错误的页面地方。
更新:
我最近必须对文件上传进行精确检查,我想出的是SWFUpload库,它完全符合我的要求,并且还有很多附加功能。我将它与 Steve Sanderson 提供的 jquery 包装器一起使用。更多细节可以在这里找到。
关键是,闪存能够在客户端检测文件大小并在遇到这种情况时做出正确反应。我认为这正是你所需要的。
此外,如果您想在客户端未安装 flash 的情况下优雅地降级为原生上传 button0,您可以实施 flash 检测检查。
处理大型上传的最佳方法是使用实现 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
}
如果您在较早的框架上运行,请尝试此处的代码(它在 VB 中,但很容易翻译):http ://www.webdeveloper.com/forum/showthread.php?t=52132
您可以检查张贴文件的长度 (FileUpload.PostedFile.ContentLength),看看它是否低于限制,并在必要时简单地显示一条友好的错误消息。