上载超过Asp.net请求长度限制的文件?
我搜了这么多,找到了,但这不完全是我要问的。我想知道是否可以创建一个IHttpModule来检查请求的ContentLength,如果可以的话,可以重定向或以某种方式抛出该请求并创建一个新的请求 具体地说,我正在尝试处理图像文件上载,但我希望请求继续到上载页面,并带有某种警告,而不是简单的错误页面。我有一段代码被一个大请求击中:上载超过Asp.net请求长度限制的文件?,asp.net,upload,file-upload,Asp.net,Upload,File Upload,我搜了这么多,找到了,但这不完全是我要问的。我想知道是否可以创建一个IHttpModule来检查请求的ContentLength,如果可以的话,可以重定向或以某种方式抛出该请求并创建一个新的请求 具体地说,我正在尝试处理图像文件上载,但我希望请求继续到上载页面,并带有某种警告,而不是简单的错误页面。我有一段代码被一个大请求击中: private void context_BeginRequest(object sender, EventArgs e) { Http
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,就像我所说的警告一样。
给出一个阅读
给出一个阅读
< p>如果你想做的就是给用户关于大图片上传状态的反馈,那么我建议你考虑使用一个基于Ajax或Flash的上传组件。大约有一百万个这样的网站,大多数都有很好的用户反馈。他们也可以处理大型文件,同时也处理多个同时上传文件。 如果你想做的就是给用户关于大图片上传状态的反馈,那么我建议你考虑使用一个基于Ajax或Flash的上传组件。大约有一百万个这样的网站,大多数都有很好的用户反馈。它们还可以处理大型文件,许多还可以同时处理多个文件上载。由于HTTP的性质,在读取所有请求数据之前,您实际上无法返回任何内容。当您收到过大的请求时,您有两个选择:- 读入所有数据,然后返回一个不错的错误页面。这听起来不错,但意味着用户必须等待上传完成,然后才能收到无法上传的消息。它还打开了一个可能的DOS攻击漏洞
- 立即终止请求。这给了用户一个糟糕的断开连接页面,但保留了安全性
还有第三种选择——使用一个高级组件,它既能提供良好的错误消息,又能提供安全性。你可以只使用flash组件,而且有很多组件,但是当然,如果用户没有flash,那你就倒霉了。由于HTTP的性质,在读取所有请求数据之前,你实际上无法返回任何内容。当您收到过大的请求时,您有两个选择:
- 读入所有数据,然后返回一个不错的错误页面。这听起来不错,但意味着用户必须等待上传完成,然后才能收到无法上传的消息。它还打开了一个可能的DOS攻击漏洞
- 立即终止请求。这给了用户一个糟糕的断开连接页面,但保留了安全性
还有第三种选择——使用一个高级组件,它既能提供良好的错误消息,又能提供安全性。你可以只使用flash组件,而且有很多组件,但是当然,如果用户没有flash,你就不走运了。上面的答案对我在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中的值为最大上载大小设置一个静态值,并重定向到与该主页相对的自定义错误页,但您明白了。以上答案对我在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中的值为最大上载大小设置一个静态值,并重定向到该主页的自定义错误页,但您明白了。这就是rm提供的链接在循环中调用ReadEntityBody的原因吗?是的,没错。它读取整个请求,以便随后发送响应。这就是rm提供的链接在循环中调用ReadEntityBody的原因吗?是的,没错。它读取整个请求,以便在之后发送响应。