Posted on 2005-11-28 10:31
2bno1 阅读(2256)
评论(14) 编辑 收藏
Feedback
反正是视为无效文件
感觉到HttpWorkerRequest 开始工作时检测到内容过长直接抛出异常比较好
因为再执行下去也没必要了!
呵呵,小猪,你说的方法我试过,但是发现行不通。
while ( contentlen - totalrecv >= received)
{
received =
wr.ReadEntityBody(buffer,
buffer.Length);
totalrecv += received;
}
received =
wr.ReadEntityBody(buffer, contentlen - totalrecv);
上面这段代码的目的就是使Context的长度小于maxRequestLength,这个步骤是必须的。
如你说的监测到内容过长直接抛出异常,这时候内容还是大于maxRequestLength,系统仍然会崩溃。
谢谢你的建议,我们可以继续讨论。

仍然是需要把客户端数据读完之后才能Redirect
其实还是内置的抛出HttpException的方法最好(没有完全读取客户端数据就结束了当前Request,可以防止攻击),不过当用户有要求的时候也没办法。
我说的这种方法是不出错的,你可以试一下
使用HttpWorkerRequest wr = ...........
然后抛出异常,再中断与客户的连接...
throw new Exception("文件太大了");
wr.CloseConnection();
我按照你说的方法试过,不行啊

还有,你的代码似乎也有点问题,因为wr.CloseConnection();在throw new Exception();后面,所以永远不会执行。
你确定是Context的长度大于maxRequestLength的时候才执行throw new Exception();的吗?
HttpApplication app = sender as HttpApplication;
HttpWorkerRequest wr = GetWorkerRequest(app.Context);
呃……谢谢楼主……
但,我是这么做的:
Protected Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
Dim request As HttpRequest = HttpContext.Current.Request
If request.ContentLength > 1024000 Then
HttpContext.Current.Response.Redirect("/max.html")
End If
End Sub
检查Request的content length超过限制后便直接redirect到提示错误的页面……
反复测试都没有发现任何不良效果……服务端绝对不会等待浏览器把所有的数据都上传完……在Firefox / Opear / IE7 / Safari上面用户都会立刻看到错误的提示页面……
唯一的例外是IE6,该死的IE6还是好等上那么十几秒才能看到转跳页面…………完全不知何故…………
如果是要从防止服务器被攻击的角度考虑,倒是可以直接:
wr.CloseConnection()
所有浏览器都会立刻看到默认的错误页面……尝试在picasa上上传一个600M的假图片便是如此……
为什么我的request.ContentLength 永元都是0