捕获“请求实体太大”错误

捕获“请求实体太大”错误

我正在运行 Web 服务器 IIS 8.0 并使用 ASP.NET 和 C#。

我有一个上传框,用户可以在其中将文件上传到服务器,超过 50MB 的限制后,白页上会出现一条消息:

The page was not displayed because the request entity is too large.

我想显示一个更加用户友好的页面,其中包含一条红色通知,显示“尝试上传文件时出错,请联系我们寻求帮助”。

在处理上传按钮单击事件的代码隐藏文件中,我添加了:

try
{
    //try to save the file to server
}
catch(Exception ex)
{
    //otherwise, set the asp:Label tag text to display error
}

但是,语句中的代码catch并未运行。我猜想错误可能出在 IIS 上,无法通过该代码语句捕获。有没有办法拦截该错误并显示更友好的错误页面?

感谢您的帮助。

答案1

如果上传的文件大于 IIS 允许的大小,它将永远无法到达 ASP.NET 运行时,并且您的异常处理毫无用处。

您应该将 uploadReadAheadSize 设置为远高于您想要允许的值,理想情况下只针对特定 URL。然后在代码中检查上传大小并显示您自己的消息。

如果用户上传的文件大于 uploadReadAheadSize,他/她仍然会收到 IIS 消息,但是如果使用较大的数字,这种情况发生的可能性会小得多。

答案2

这里有很多解决方案/评论,但没有一个能解决根本问题。什么实体太大?我们遇到了同样的问题,最终确定错误的实体是 ASPX 页面中的视图状态对象。仅仅将 maxBufferPoolSize、maxBufferSize 和 maxReceivedMessageSize 的大小设置得非常大并不是真正正确的解决方案。它会起作用,但你只是掩盖了问题,它会在将来的某个时候发生。

ViewState Web 应用程序是无状态的。这意味着每次我们向服务器发出请求以获取页面时都会创建一个新的页面实例,而往返之后我们的页面会立即丢失。这种情况只发生在一台服务器上,Web 页面的所有控件都会被创建,而往返之后服务器会销毁所有实例。因此,为了保留控件的值,我们使用状态管理技术。View State 是在往返之间保存页面和控件的值的方法。它是一种页面级状态管理技术。View State 默认处于打开状态,并且通常会序列化页面上每个控件中的数据,而不管它是否在回发期间实际使用。

解决方案 我们的网页显示记录的网格视图,根据用户请求,该视图允许访问底层数据查询视图中的每条记录。随着记录被添加到此视图之外的表中,Gridview 数据集变得太大,ASPX 页面无法保存和调用视图状态对象。我们的解决方案是了解需要整个数据集的业务原因,结果发现通常只需要过去 7 天的数据,任何更早的数据都由常备报告提供。一旦理解了这一点,我们只需修改页面查询以限制为过去 7 天的数据,公布更改并通知用户。问题解决了。

答案3

相关内容