httpmodule 获取上传文件大小后,如何中止上传进程?

986753421 2007-09-17 02:28:13


用httpmodule很容易获取上传文件的总大小,郁闷的是上传进程已经开始,有什么办法可以中止上传进程?

if (!HttpContext.Current.Request.ContentType.ToLower().StartsWith("multipart/form-data")) return;

IServiceProvider objIProvider = (IServiceProvider)HttpContext.Current;
HttpWorkerRequest wr =(HttpWorkerRequest) objIProvider.GetService(typeof(HttpWorkerRequest));
if (!wr.HasEntityBody()) return;

long lngTotalLength = Convert.ToInt64(wr.GetKnownRequestHeader(11));

//这里已经获得上传文件的大小,但却停不下来上传进程,过路的高人请指点迷津
...全文
461 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
986753421 2007-09-24
  • 打赏
  • 举报
回复

HttpContext.Current.Response.StatusCode = 500;
HttpContext.Current.ApplicationInstance.CompleteRequest();
这个可以停下来,不过文件大的时候还是会有问题,拖有些久了,先结贴。

另外服务推的思路基本上已经实现,给客户端的iframe返回如下代码。

private void sfxProcessCallBack(long nTotalLength, long nCurLength)
{
string sCallBack=null;
if (String.IsNullOrEmpty(sCallBack)) sCallBack = "sfxPortraitUploadOver";//回调函数名

//构造执行回调函数脚本
System.Text.StringBuilder objBuilder = new System.Text.StringBuilder();
objBuilder.Append("<script type='text/javascript'>");
objBuilder.Append("window.parent." + sCallBack + "({TotalLength:"+nTotalLength.ToString()+",CurLength:"+nCurLength.ToString()+"});");
objBuilder.Append("</script>");

HttpContext.Current.Response.Write(objBuilder.ToString());
}

//以下为数据读取的部分代码
private void sfxCatchEntityBody(delProcessCallBack objCallBack)
{
//获取数据并添加指定的数据缓冲中

if (this._ReadCompleted) return;

byte[] btPerLoad = this._wr.GetPreloadedEntityBody();
if (btPerLoad != null && btPerLoad.Length > 0)
{

Array.Copy(btPerLoad, this._data, btPerLoad.Length);
this._CatchLength = btPerLoad.Length;
}

if (!this._wr.IsEntireEntityBodyIsPreloaded())
{
byte[] btBlockBuff = new byte[_BLOCK_BUFF_SIZE];//上传缓冲块,8K
long lngRemainLength = this._TotalLength - this._CatchLength;
while (lngRemainLength > 0)
{
long lngBuffSize = lngRemainLength < btBlockBuff.Length ? lngRemainLength : btBlockBuff.Length;
int iReadSize = this._wr.ReadEntityBody(btBlockBuff, Convert.ToInt32(lngBuffSize));
if (iReadSize <= 0)
{
//全部读入,退出循环,执行后续操作
break;
}
Array.Copy(btBlockBuff, 0, this._data, this._CatchLength, iReadSize);

lngRemainLength -= iReadSize;
this._CatchLength += iReadSize;
if (this._CatchLength > _MAX_REQUEST_LENGTH)
{
throw new Exception("实际读入的数据超过最大限制");
}
//此处调用上面的函数,就会每读一块即把进度信息“推”给客户端的iframe。
//客户端无刷新实现进度、服务器端无需保存进度数据
if (objCallBack != null) objCallBack(this._TotalLength, this._CatchLength);
}
}
this._ReadCompleted = true;

}
honey52570 2007-09-18
  • 打赏
  • 举报
回复
mark
watson110 2007-09-18
  • 打赏
  • 举报
回复
mark~~~~~~~~
heqi915 2007-09-18
  • 打赏
  • 举报
回复
关注一下
KKND2006 2007-09-18
  • 打赏
  • 举报
回复
晕了,搞这么复杂

用VC写一个上传OCX也就三四天

可以想怎么干就怎么干...

进度条,多线程,随时中断,随时获取Server端状态

FPT/HTTP等多种方式连接Server

......我怎么象是在做广告......也好,为自己的BLOG做做广告......
cat_hsfz 2007-09-18
  • 打赏
  • 举报
回复
直接Response.End()看看行不行。
986753421 2007-09-18
  • 打赏
  • 举报
回复
再向大家推荐一篇文章:《超酷代码:通过 ASP.NET 异步编程实现可扩展的应用程序》
http://msdn.microsoft.com/msdnmag/issues/07/03/WickedCode/Default.aspx?loc=zh

同样的思路应该可以用在大文件上传中,也就是上传过程采用异步模块,对降低上传过程中对CPU的占用率应该很有用,尽管会降低单一上传的效率,对服务器的整体性能会有很大好处,不会因为某个线程在上传,造成网站性能整体下降太大。

一点浅见,见笑。
tds__609 2007-09-18
  • 打赏
  • 举报
回复
关注下~
以前看过一个上传用的DLL
好象也无法终止上传
986753421 2007-09-18
  • 打赏
  • 举报
回复
多谢各位关注,说一下有关进展,共享一下

1、在自定义HttpModule过程中使用以下Request、Reponse属性或方法,会引发数据上传(粗略跟踪Reflector反编译的函数,不保证完全、正确)
Request的Files、InputStream、TotalBytes、BinaryRead、SaveAs、Form、Item
Reponse的ClearHeaders、Redirect
注:网上有资料说Redirect可以中止上传,但我试的无效,而且从反编译中也可以看到Redirect调用了相关上传数据的函数,不知道是不是在什么条件有效?

2、mqcan提供的资料,没细看(实际java没弄过,看的一头雾水),其中有取消上传,似乎只是清理自定义的资源。

3、hdt(倦怠) 提供的CompleteRequest方法有效,调用的方法为HttpContext.Current.ApplicationInstance.CompleteRequest(),只是目前还是有点问题,调用此方法后,会引起页面的再次请求(时有时无),发生时reponse.write()发往客户端的内容会丢失,不明白为什么,有知道原因的兄弟说一下。

目前的进展基本上就这些,最后这个问题搞定我再结帖,有资料、有思路麻烦提一下。

另外有个想法,也想在此和大家讨论一下:看了几个上传组件的开源代码(水平有限,都是一知半解),进度条的处理思路一般是修改meta,定时向服务器读取进度数据进行刷新。我的想法是:既然连接是常连接,是否可以采用服务器推的办法,比如客户端用iframe,服务器端在读取一定数据后,将进度数据以发送js脚本的方式推到客户端,还没做测试,也请兄弟们在原理上讨论一下,这个思路是否可行?
如果行的话,好处很明显:客户端无刷新、有效减少回发调用的次数。
真相重于对错 2007-09-17
  • 打赏
  • 举报
回复
try
HttpContext.CompleteRequest()
felix3118 2007-09-17
  • 打赏
  • 举报
回复
没用过哦
flyingfz 2007-09-17
  • 打赏
  • 举报
回复
mark 下, 学习
懒牛科技 2007-09-17
  • 打赏
  • 举报
回复
java的.你可以参考下!
懒牛科技 2007-09-17
  • 打赏
  • 举报
回复
http://java.chinaitlab.com/net/534429.html
SkyStar 2007-09-17
  • 打赏
  • 举报
回复
貌似停不了:其实一旦执行,就进入了所谓的http无状态模式,不好停的;如果哪位有解决方法,不妨告知,我们也分享一下。
xiaoliangwh 2007-09-17
  • 打赏
  • 举报
回复
up

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧