我搜索了SO并找到了this question,但这并不是我所要求的。我想知道是否可以创建一个可以检查请求的ContentLength的IHttpModule,如果是这样,重定向或以某种方式抛出该请求并创建一个新请求。
具体来说,我正在尝试处理图像文件上传,但我希望请求继续上传页面,并发出某种警告,而不是平面错误页面。我有一些代码被大量请求命中:
private void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
if (context.Request.ContentLength > (4 * 1024 * 1024))
{
}
}
执行路径像我想要的那样进入IF块。但是从这里开始,我不确定该去哪里。这是一个糟糕的方法吗?
编辑:实际上(没有此模块),Fiddler报告IIS正在返回500代码。我想避免这种情况,让代码从请求的页面返回200,就像我说的那样警告。
答案 0 :(得分:4)
由于HTTP的性质,在读取所有请求数据之前,您实际上无法返回任何内容。当您收到超大请求时,您有两种选择:
还有第三种选择 - 使用高级组件,既提供了良好的错误消息,又提供了安全性。你可以使用仅限闪存的组件,其中有很多组件,但当然,如果用户没有闪存,你就不走运了。
答案 1 :(得分:1)
给this一个阅读
答案 2 :(得分:0)
如果您只想向用户提供有关大型图片上传状态的反馈,那么我建议您考虑使用基于Ajax或Flash的上传组件之一。其中大约有一百万,并且大多数都有非常好的用户反馈。它们还可以处理大型文件,还可以处理多个同时上传的文件。
答案 3 :(得分:0)
上面的答案在IIS 7.5上对我不起作用。我们终于想出了以下内容:
void Application_PreSendRequestHeaders(Object sender, EventArgs e)
{
if (
Request.Headers["Content-Length"] != null &&
int.Parse(Request.Headers["Content-Length"]) > 150000000 &&
Request.RawUrl.EndsWith("/ProjectReleases.aspx?Mode=Create", StringComparison.OrdinalIgnoreCase))
{
try
{
Response.Redirect("http://anyurl", true);
}
catch (HttpException ex)
{
if (String.Compare(ex.Message, "Maximum request length exceeded.", StringComparison.Ordinal) != 0)
{
Server.ClearError();
Response.ClearHeaders();
Response.Redirect("http://www.edward-williams.com", true);
}
}
}
}
无需修改最大上传大小。最终版本根据web.config中的值设置了最大上传大小的静态值,并重定向到自定义错误页面与该主页,但您明白了。