在下载过程中点取消下载,服务端怎么中断并释放资源?

ssq237712 2006-07-10 09:51:52
服务端代码:
FileStream f = ...;
Response.Clear();
Response.Buffer = true;
Response.AddHeader(...)
...
try
while (Response.IsClientConnected)
{
bytes[] b = new bytes[1024];
int len = f.Read(buffer, 0, 1024);
Response.OutputStream.Write(b, len);
....
}
finally
{
释放资源
}

在下载过程中,客户端点取消,Response.IsClientConnected一直为true,要等很长时间(估计要把文件读完)后才能响应客户端其他操作。
有什么办法,在客户端点了取消后,直接跳出循环?
...全文
364 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssq237712 2006-07-11
  • 打赏
  • 举报
回复
很奇怪,客户端点取消后,服务端就在Response.IsClientConnected这里死掉了
Knight94 2006-07-11
  • 打赏
  • 举报
回复
to 点击取消 是客户端点IE的下载提示框中的取消,代码能捕获这个事件?

不能
ssq237712 2006-07-11
  • 打赏
  • 举报
回复
那下一个大文件,不要死人啊:(
:((((
伴老思源 2006-07-11
  • 打赏
  • 举报
回复
在下载过程中点击取消,释放资源??

不太可能,在没有执行完时,
你点击得不到服务器的及时响应,
它会先执行你的下载任务在执行取消
wlovenet 2006-07-11
  • 打赏
  • 举报
回复
up
pshy 2006-07-11
  • 打赏
  • 举报
回复
關注...
ssq237712 2006-07-11
  • 打赏
  • 举报
回复
点击取消 是客户端点IE的下载提示框中的取消,代码能捕获这个事件?
Knight94 2006-07-11
  • 打赏
  • 举报
回复
to 用Session怎么做呢?

例如:
// server side
while( Session["Download"] != null && Session["Download"].ToString() == "true" )
{
//Download file
}

然后你在点击下载的时候,首先要把此值赋为true;

如果点击取消,把此值赋为false即可。
ssq237712 2006-07-11
  • 打赏
  • 举报
回复
to Knight94(愚翁)
用Session怎么做呢?

to zlkingdom(风之悲伤) :
客户端取消的时候能发回指令?怎么截获IE那个下载提示框的取消事件?
zlkingdom 2006-07-11
  • 打赏
  • 举报
回复
可以让用户点取消时给服务器回传一个指令,然后根据指令服务器断开下载的连接
Knight94 2006-07-11
  • 打赏
  • 举报
回复
不可能,其实如果你这段代码,如果是写在page_load事件或者某个事件中的话,那么其实对于Response.IsClientConnected判断没有任何意义,因为你很难判断在服务器端判断客户端是否断开了。

用Session来代替看是否可以能达到你要求的效果。
ssq237712 2006-07-11
  • 打赏
  • 举报
回复
好像可以了。用了一种很笨的方法。
把下载部分的代码写到一个Timer中去执行,每读一块,写一下标记,主线程每隔1秒区判断一个标记,连续20次标记不正确(20秒)则退出并释放资源。
但这个方法有一个问题,如果客户端的下载提示框弹出后,不点下载或打开等任何按钮,20秒后也会重置。另外,不知道网速很慢的情况下会不会有影响。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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