当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。
对于大小在maxRequestLength
和maxAllowedContentLength
之间的上传的文件,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中的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>
在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将自动终止连接。