关于session单线程的问题,你们是怎么解决下载的啊

my8861762 2012-03-14 09:51:00
背景:
例如页面A.ASPX中有Intersoft WebUI Studio 的WEBGRID,选择数据导出,然后会弹出一个窗口,通用为A.ASPX后面不带传值。
然后就可以下载东西了。
---------分------------隔-----------------线------------------


我有一个服务器控件利用的回调,拖到B.APSX页面,有下载的回调请求,大家知道的,回调里面VIEWSTATE,COOKIE是无效的,只能用APPLICATION,或者SESSION,CACHE,也没有RESPONSE让我输出文件,因此只有用传回一段JS代码,用来打开新的窗口,地址还是B.ASPX,然后在控件的初始化等事件中查找传的参数来进行文件下载(文件为流,不是真正存在的文件).


问题就来了,就在传的参数这里了,我看到Intersoft WebUI Studio也没有用传址的方法传,而且知道的,肯定不能用APPLICATION或者CACHE这样的全局,只能用SESSION(上面说了,回调里面不能用VIEWSTATE,COOKIE),但知道的SESSION是单线程的,因此,只要我设置了SESSION值后,在新开的窗体里面再读取了SESSION,那么这两个窗体就是一个线程了,所以在新开的窗体的文件下载未完成前,前一个窗体是卡死的,泪奔啊,怎么办,怎么实现不用传地址的方法下载啊(因为传地址的方法会使文件不安全,把地址给其他人也能下载了)。


既然人家Intersoft WebUI Studio也有办法解决,各位高手有没办法啊?



页面B→ 回调JS打开新的→ 页面B
写SESSION 读SESSION 就成了两个页面一个线程了,新的页面B下载文件时旧页面就卡死

用过委托等多线程进行下载,无效,因为委托等也是在主线程下运行,因此实现委托后主线程继续执行下面的程序,也采用的RESPONSE输出,委托后的多线程也是采用RESPONSE输出,如果委托线程输出过慢就被主线程抢先,造成页面下载失败,我试过,只要页面输出31748Bytes就被主线程抢了RESPONSE,下载失败!


谢谢各位了~


...全文
318 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bxline2 2014-10-10
  • 打赏
  • 举报
回复
有人帮忙吗,大家都怎么解决的啊,没有无私的人贡献一下吗
bxline2 2014-10-09
  • 打赏
  • 举报
回复
这个问题我也泪奔中,有高手吗?
ycproc 2012-04-10
  • 打赏
  • 举报
回复

session 与单线程有什么区别吗?

线程与session 有互斥吗?
kxc1991312 2012-04-10
  • 打赏
  • 举报
回复
关注ing
mngzilin 2012-04-09
  • 打赏
  • 举报
回复
对路径进行DES加密也可以,这样别人就不会知道你的路径是什么,除非知道密钥

传值到download页面可以判断权限,然后再下载
mngzilin 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

想的好像复杂了,其实我也没看明白怎么回事儿


不复制,其实就是一个页面传值到另一个页面,但不用地址传值的话就只能用session了,但是!只要两个页面用了session两个页面就共用一个线程了,也就是如果第二个页面是个下载文件的页面,它一直在用线程读取文件,然后输入,那么第一个页面就不管你做什么都是假死状态,直到下载完毕,扩展一下的话会发现,只要读取了这个……
[/Quote]

是这么回事儿啊,你在A页面中填出浮动DIV,内置iframe,src指向B页面,用js直接传值给B页面就行了,B执行完毕下载后,再用js结束自己(隐藏浮动div),具体js传值的方法百度
my8861762 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

用多线程的方法做就可以解决了!(你用多线程的方法做不行,是因为你没有设置正在的断点下载!!!)
[/Quote]


主线程 → 分线程
↓     ↓
接着运行
如果挂起
那么其他  读取文件并输出
页面还是
假死
↓      ↓
结果就是两个线程抢response, 如果不限速,运气好的话分线程能一直保持,运气不好就被主线程抢走,然后下载失败,如果限速,读取文件只要小于31748Bytes就被主线程抢走,下载失败~
my8861762 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

用多线程的方法做就可以解决了!(你用多线程的方法做不行,是因为你没有设置正在的断点下载!!!)
[/Quote]

那要怎么用?能给实例么?
我用多线程了,由于是在主线程下分的线程结果是
主线程 → 分线程
↓ ↓
接着运行
如果挂起
那么其他 读取文件并输出
页面还是假死
↓ ↓
结果就是两个线程抢response, 如果不限速,运气好的话分线程能一直保持,运气不好就被主线程抢走,然后下载失败,如果限速,读取文件只要小于31748Bytes就被主线程抢走,下载失败~

1,发现主线程是不能结束的。
2,RESPONES.END不能用来结束主线程。
3,主线程抢走后开始接着输出剩余的HTML代码(因为任何事件都是在render之前的,所以会开始渲染而输出HTML代码,和前面输出的二进制流打架,然后下载失败。
my8861762 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

想的好像复杂了,其实我也没看明白怎么回事儿
[/Quote]

不复制,其实就是一个页面传值到另一个页面,但不用地址传值的话就只能用session了,但是!只要两个页面用了session两个页面就共用一个线程了,也就是如果第二个页面是个下载文件的页面,它一直在用线程读取文件,然后输入,那么第一个页面就不管你做什么都是假死状态,直到下载完毕,扩展一下的话会发现,只要读取了这个session的所有页面都是是假死(已经打开的就假死,新打开的就一直转,打不开),有办法解决没?
cornertree 2012-04-09
  • 打赏
  • 举报
回复
用多线程的方法做就可以解决了!(你用多线程的方法做不行,是因为你没有设置正在的断点下载!!!)
mngzilin 2012-04-09
  • 打赏
  • 举报
回复
想的好像复杂了,其实我也没看明白怎么回事儿
jiuhexuan 2012-04-05
  • 打赏
  • 举报
回复
大致看了下,不知道是否准确

一个数据绑定页,单击弹出下载这个数据列表内容的页。

你可以吧数据缓存到Cache,或者Session其他,下载页直接读取,不牵涉任何多线程最好。

web的一个页面就是一个生命周期,除了Session这些类似牵涉到上下文的,基本只是传值,展示出来的时候就结束逻辑了。其他页面只是通过get,post,上下文等获取上页的内容。

你想的太复杂了。
实在不行,在下载页,重新读取数据绑定页的数据
边城的刀声 2012-04-05
  • 打赏
  • 举报
回复
你下载的时候,是打开文件,然后再下载吗?
如果这样的话,那你加个锁吧

private static Object downloadLock = new downloadLock;
private void Download(){
lock(downloadLock){
//你的下载代码
}
}
dsmetty 2012-04-05
  • 打赏
  • 举报
回复
一直都不懂线程
my8861762 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zyug 的回复:]

你说的我怎么不懂呀?

你弹js B还是B呀,再说弹js的时候B已经在服务器上被销毁了,你再请求一次B,多加一个参数或是按个按钮,表明这是下载~~

B再执行一下,显示的时候判断这个参数.存在就download不存在就render
[/Quote]

建议你试一下,session是单线程的,只要在A.ASPX里面用了SESSION,再JS弹第二个A.ASPX,同样使用了SESSION,这两个页面就成同一个线程了,只要一个卡死了,另一个就死了。

具体测试方法

A.ASPX中初始化时读取session["test"],如果不是NULL就线程挂起或者SLEEP,页面有一个按钮,按钮一按就session["test"]="test"; 并弹出一个新的A.ASPX,此时,新的页面初始化时读取SESSION,发现SESSION不是NULL,因此线程挂起,此时再返回来操作第一个页面,会发现第一个页面也卡死了。
zyug 2012-03-19
  • 打赏
  • 举报
回复
你说的我怎么不懂呀?

你弹js B还是B呀,再说弹js的时候B已经在服务器上被销毁了,你再请求一次B,多加一个参数或是按个按钮,表明这是下载~~

B再执行一下,显示的时候判断这个参数.存在就download不存在就render
my8861762 2012-03-19
  • 打赏
  • 举报
回复
有人可以把http://topic.csdn.net/u/20120319/16/2105e9bb-7e86-4035-97f2-1903c23ff5a6.html这个帖子也给我回答了么?

62,050

社区成员

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

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

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

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