我在哪里捕获并处理 IIS7 中超过 maxAllowedContentLength 的情况?
我有一个 aspx 页面,允许用户上传文件,并且我希望将最大文件上传大小限制为 10MB。 IIS7、.NET 3.5。 我在 web.config 文件中进行了以下配置:
<location path="foo.aspx">
<system.web>
<!-- maxRequestLength: kbytes, executionTimeout:seconds -->
<httpRuntime maxRequestLength="10240" executionTimeout="120" />
<authorization>
<allow roles="customRole"/>
<!-- Deny everyone else -->
<deny users="*"/>
</authorization>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- maxAllowedContentLength: bytes -->
<requestLimits maxAllowedContentLength="10240000"/>
</requestFiltering>
</security>
<handlers accessPolicy="Read, Script">
<add name="foo" path="foo.aspx" verb="POST"
type="System.Web.UI.PageHandlerFactory"
preCondition="integratedMode" />
</handlers>
</system.webServer>
</location>
我有一个实现 IHttpModule
的自定义错误处理模块。 我发现当超过 maxRequestLength 时,确实会引发 HttpApplication.Error 。 但是,当我使用 maxAllowedContentLength 时,不会引发 HttpApplication.Error 事件,用户会被重定向到 404.13 页面。 我已经附加了 Visual Studio,并打开了第一次机会异常,没有抛出任何异常。
我的第一个想法是检查早期事件中的标题内容长度 - 是否有关于我在哪里执行此操作的建议/最佳实践? 发布日志请求? 结束请求?
I have an aspx page where I’m allowing a user to upload a file and I want to cap the max file upload size to be 10MB. IIS7, .NET 3.5. I have the following configured in my web.config file:
<location path="foo.aspx">
<system.web>
<!-- maxRequestLength: kbytes, executionTimeout:seconds -->
<httpRuntime maxRequestLength="10240" executionTimeout="120" />
<authorization>
<allow roles="customRole"/>
<!-- Deny everyone else -->
<deny users="*"/>
</authorization>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- maxAllowedContentLength: bytes -->
<requestLimits maxAllowedContentLength="10240000"/>
</requestFiltering>
</security>
<handlers accessPolicy="Read, Script">
<add name="foo" path="foo.aspx" verb="POST"
type="System.Web.UI.PageHandlerFactory"
preCondition="integratedMode" />
</handlers>
</system.webServer>
</location>
I have a custom error handling module that implements IHttpModule
. I’ve found that when maxRequestLength
is exceeded, HttpApplication.Error
does indeed get raised. However when I play with maxAllowedContentLength
, the HttpApplication.Error
event isn’t being raised and the user gets redirected to a 404.13 page. I've attached with Visual Studio with first chance exceptions turned on nothing is being thrown.
My first thought is to check the header content length in an earlier event – are there recommendations/best practices of where I do this? PostLogRequest? EndRequest?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最简单的方法是在页面本身的OnError方法中处理。
我认为这仅适用于 .NET 4.0,因为 WebEventCode 属性在 .NET 4.0 中被记录为 NEW。
我所做的是:
确保错误完全在请求的页面上得到处理,并且该页面能够报告错误。
另请注意,虽然浏览器最终会收到正确的响应,但浏览器可能会花一些时间上传整个请求,然后才能处理服务器的响应并显示它。 此行为可能被定义为 HTTP 协议中服务器/浏览器交互的一部分,因此对此可能无能为力。
The simplest method is to handle it in the OnError method of page itself.
I think this works only in .NET 4.0, since the WebEventCode property is documented as NEW in .NET 4.0.
What I did was:
This ensures the error is handled entirely on the requested page, and the page is capable of reporting errors.
Also note that while the browser will eventually receive a proper response, the browser may take its time uploading the entire request before it handles the server's response and displays it. This behavior is probably defined as part of the server/browser interaction in the HTTP protocol, so probably not much can be done about that.
查看 IIS 7.0 的 ASP.NET 应用程序生命周期概述并在进行我自己的实验时,我假设请求验证是在引发任何事件之前由 IIS 在内部完成的。
看起来只有 LogRequest、PostLogRequest、EndRequest、PreSendRequestContent 和 PreSendRequestHeaders 在内部验证后出现此错误。
我决定将一个事件处理程序附加到自定义错误处理程序中的
HttpApplication.EndRequest
事件,并检查 POST 上的 404.13 状态代码并根据需要进行处理,就我而言是重定向到调用页面,该页面将检查 Server.GetLastError() 并向最终用户显示友好错误。我欢迎对此方法和替代方案提供反馈。
After looking at the ASP.NET Application Life Cycle Overview for IIS 7.0 and doing my own experimentation, I'm assuming that the request validation is done internally by IIS before any of the events are raised.
It looks like only LogRequest, PostLogRequest, EndRequest, PreSendRequestContent, and PreSendRequestHeaders are raised after the internal validation with this error.
I've decided to attach an event handler to the
HttpApplication.EndRequest
event in my custom error handler and check for the 404.13 status code on POST and handle as I need it to be handled, which in my case is to redirect to the calling page which will checkServer.GetLastError()
and display a friendly error to the end user.I'd welcome feedback on this approach and alternatives.