当ASP.NET MVC中的file upload超过允许的大小时显示自定义错误页面

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

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

我试图捕捉自定义属性中的exception,并重写控制器中的OnException。 为什么不能在属性或OnException方法中捕获exception呢?

尽pipe可以在Global.asax中的Application_Error中捕获exception,但Response.Redirect和Server.Transfer都不能用于redirect到自定义错误页面。 Server.Transfer给出“无法处理子请求”错误,response.redirect给出“Http头已发送”错误。

有任何想法吗?

提前致谢!

马库斯

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

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

默认设置略小于30 MB。

对于大小在maxRequestLengthmaxAllowedContentLength之间的上传的文件,IIS7将会抛出HTTP代码为500的HttpException ,并且消息文本Maximum request length exceeded 。 当抛出这个exception时,IIS7立即终止连接。 因此,只有在global.asax.cs中的Application_Error()中处理并清除HttpException (使用Server.ClearError() )时,redirect此错误的HttpModule才会起作用。

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

对于IIS7上的这个错误的redirect,我build议redirecthttpErrors 。 要redirect到不同的操作,请为web.config中的maxAllowedContentLengthmaxRequestLength更小的值,并将以下内容添加到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> 

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

为了能够redirect整个请求,必须在redirect之前读取。

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

速度eviews链接真的有助于解决这个问题。 如上所述,唯一的缺点是在redirect完成之前需要读取整个请求(和文件)。

但是,它可以被限制为只有在file upload控件所在的页面通过像这样被加载时才运行

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

你需要做一个自定义的HttpHandler来为你做这个。 如果上传大小过大(如您发现的),ASP.NET将自动终止连接。