【问题标题】:Display custom error page when file upload exceeds allowed size in ASP.NET MVC当文件上传超出 ASP.NET MVC 中允许的大小时显示自定义错误页面
【发布时间】:2010-05-03 15:36:10
【问题描述】:

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

上传大文件时,会在调用控制器中的上传操作方法之前引发 HttpException。这是意料之中的。

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

虽然可以在 global.asax 中捕获 Application_Error 中的异常,但 Response.Redirect 和 Server.Transfer 都不能用于重定向到自定义错误页面。 Server.Transfer 给出“处理子请求失败”错误,response.redirect 给出“Http headers already sent”错误。

有什么想法吗?

提前致谢!

马库斯

【问题讨论】:

  • 不是您问题的答案。我使用 SWFUpload (swfupload.org) 并设置文件大小限制。这样,客户端甚至无法开始上传大于限制的文件。您可以像这样在 JavaScript 中设置限制:file_size_limit:“20 MB”。见文档:demo.swfupload.org/Documentation

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


【解决方案1】:

在IIS7及以上运行时还有一个参数:

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

默认设置略小于 30 MB。

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

对于大小大于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>

【讨论】:

  • 你如何用 IIS6 做到这一点?
  • @Jonathan:看到这个答案stackoverflow.com/questions/2759193/…
  • 需要注意的重要一点是,如果您想避免不得不完全处理 HTTP 500 Maximum request length exceeded 错误,您应该将maxRequestLengthmaxAllowedContentLength 设置为相同的大小(前者应以千字节表示,而后者应以explained here 的字节表示)。这样就不会有大小介于两个值之间的请求,它们只能小于或大于阈值。
  • responseMode="Redirect" 是 404.13 错误所必需的。它在 ExecuteURL 模式下根本不起作用。
【解决方案2】:

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

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

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

【讨论】:

  • 这个解决方案的缺点是需要在重定向之前读取整个请求(和文件)。
  • 这不是一件坏事,但如果这是唯一的方法。有什么选择?首先,是否可以在读取整个请求之前检测到 maxRequestLength 超出错误?此事件必须在代码中捕获,因此您可以运行一些准备代码并调用 Server.Transfer。其次,如果你可以在整个请求被读取之前做一些事情,并且你以某种方式取消它,那么用户的网络浏览器如何响应?会不会认为连接失败?
【解决方案3】:

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

但是可以限制为只在存在文件上传控件的页面通过这样加载来运行

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

【讨论】:

    【解决方案4】:

    您需要创建一个自定义的 HttpHandler 来为您执行此操作。如果上传大小太大(如您所见),ASP.NET 将自动终止连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-04
      • 2012-06-29
      • 2011-10-07
      • 2016-08-18
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      相关资源
      最近更新 更多