在ASP.NET MVC中文件上载超过允许的大小时显示自定义错误页面

时间:2010-05-03 15:36:11

标签: c# asp.net asp.net-mvc iis-7 iis-6

我的主要问题是,当上传的文件超出允许的大小(web.config中的maxRequestLength)时,我想显示自定义错误页面。

上传大文件时,在调用控制器中的上传操作方法之前,会抛出HttpException。这是预期的。

我试图在自定义属性中捕获异常,并在控制器中覆盖OnException。为什么不能在属性或OnException方法中捕获异常?

虽然可以在global.asax中捕获Application_Error中的异常,但Response.Redirect和Server.Transfer都不能用于重定向到自定义错误页面。 Server.Transfer给出“无法处理子请求”错误,而response.redirect给出了“已发送的Http头”错误。

有什么想法吗?

提前致谢!

马库斯

4 个答案:

答案 0 :(得分:57)

在IIS7及更高版本下运行时,还有另一个参数:

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="10485760" />
    </requestFiltering>
  </security>
</system.webServer>

默认设置略小于30 MB。

对于大小介于maxRequestLengthmaxAllowedContentLength之间的上传文件,IIS7会抛出HttpException,其中包含HTTP代码500和消息文本Maximum request length exceeded。抛出此异常时,IIS7会立即终止连接。因此,只有在global.asax.cs中的HttpModule中处理并清除HttpException Server.ClearError()时才会重定向此错误的Application_Error()

对于大小超过maxAllowedContentLength的上传文件,IIS7将显示错误代码404和subStatusCode的详细错误页面.13。错误页面可以在C:\ inetpub \ custerr \ en-中找到US \ 404-13.htm

对于IIS7上此错误的重定向,我建议改为在httpErrors上重定向。 要重定向到其他操作,请在web.config中为maxAllowedContentLength设置一个小于maxRequestLength的值,并将以下内容添加到web.config中:

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace"> 
    <remove statusCode="404" subStatusCode="13" /> 
    <error statusCode="404" subStatusCode="13" prefixLanguageFilePath=""
       path="http://yoursite.com/Error/UploadTooLarge" responseMode="Redirect" /> 
  </httpErrors>
</system.webServer>

答案 1 :(得分:3)

在IIS6上运行时,我通过处理BeginRequest解决了HttpModule并检查httpApplication.Context.Request.Length是否大于maxRequestLength。

在重定向之前,必须先读取整个请求的重定向。

请参阅此链接中的代码示例: http://www.velocityreviews.com/forums/t97027-how-to-handle-maximum-request-length-exceeded-exception.html

答案 2 :(得分:1)

速度eviews链接对解决问题非常有帮助。如上所述,唯一的缺点是在重定向完成之前需要读取整个请求(和文件)。

但它可以限制为只在存在文件上传控件的页面上运行时才像这样加载

if (HttpContext.Current.Request.Url.ToString().Contains("UploadedPage.aspx") 
{
    //read and process page request
}

答案 3 :(得分:0)

你需要制作一个自定义的HttpHandler来为你做这件事。如果上传大小太大(如您所知),ASP.NET将自动终止连接。