1 $("#submit").click(function () { 2 $.ajax({ 3 type: "POST", 4 url: "Handler1.ashx", 5 data: { action: "ajax" } 6 }); 7 setInterval(function () { 8 $.ajax({ 9 type: "POST", 10 url: "Handler2.ashx", 11 data: { action: "key" } 12 }); 13 }, 10000) 14 });
js代码
context.Response.ContentType = "text/plain"; string action = context.Request["action"]; if (action == "ajax") { for (int i = 0; i < 100; i++) { //模拟处理,并发送消息 context.Session["key"] = i; Thread.Sleep(2000); } }
Handler1代码
context.Response.ContentType = "text/plain"; string action = context.Request["action"]; if (action == "key") { string aa = context.Session["key"].ToString(); context.Response.Write(aa); }
Handler2代码
描述:页面点击按钮发起两个ajax请求(一个执行操作,一个获取执行进度),
功能:想实现一个后台有个长时间操作的动作(比如大量数据操作),前台页面显示执行到多少条,一般都是放一个loading的gif图片,但我是要实时显示执行到多少了,比如,执行到1/100000,100/100000,1789/100000这样的进度。
可能多个人在操作,每个人的进度应该都是不同的。
1)Handler2里面的session一直null(Handler1的循环执行完成了才会去执行Handler2不是两边同时执行),这个怎么理解?
2)调试时Handler1里面执行完了,才会跳到Handler2开始执行,这两个请求一发起不是同时自己执行自己的吗(Handler1的循环执行,Handler2读取session也在同时执行)?
1.实现IRequiresSessionState 接口(空接口,只是标识当前handler需要session)
2.没看懂。
1,只继承IRequiresSessionState 接口,要实现什么方法吗?
2,js脚本在发起Handler1的请求后,10秒就会发起Handler2的请求,Handler1里面执行的是一个长时间操作,Handler1代码我写的循环小而以,比如可能会执行10分钟。现在Handler2每隔10秒就会有一个请求,而这些请求不会得到影响,是在Handler1执行完成后,Handler2的那些请求才开始一一影响。所以就是我问的为什么他们两不是同步执行,这样Handler1执行,Handler2能获取到Handler1的执行进度了。
@wenbolwm: IRequiresSessionState只是一个标识,没任何方法需要实现
2.为什么不在handler1中不断的flush进度,还要额外搞个handler2来接管?
@Daniel Cai: 请问下怎么返回进度?
ashx如楼上所说,需要继承那个接口才可以用Session。。。
1执行完了才执行2的话,那你应该在1的回调函数里注册那个setInterval。。。
回答了楼下,在1执行完后才发起2的请求得到的是1处理完成的结果,我要是1执行的实时进度
一般处理程序中药操作session必须要继承IRequiresSessionState 接口!!
另外第二点真的是没看懂你说什么,但是大致能猜到意思,试一下代码:
$("#submit").click(function () { $.ajax({ type: "POST", url: "Handler1.ashx", data: { action: "ajax" }, success:function(){ setInterval(function () { $.ajax({ type: "POST", url: "Handler2.ashx", data: { action: "key" } }); }, 10000) } }); });
你这样写是Handler1.ashx里面的循环都执行完了,才去发起Handler2.ashx的请求,这样就没有了进度的效果,就是类似于我后面有大量数据操作,我页面上要显示当前处理到多少了。你那写是都处理完了,我再发起一个请求得到处理完的进度没有意思了。
ajax是异步请求,同步去执行的,不会等到第一个请求执行完了才会去执行第二个请求,session是NULL是因为你没有继承IRequiresSessionState这个接口
执行下来发现Handler2的请求不会立即影响而是在Handler1里面执行完成后Handler2才开始一一影响那些请求,这样就没有了页面实时显示Handler1的执行进度效果了