首页 新闻 会员 周边 捐助

asp.net http请求问题

0
悬赏园豆:50 [待解决问题]
 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也在同时执行)?

wenbolwm的主页 wenbolwm | 初学一级 | 园豆:131
提问于:2016-09-28 18:59
< >
分享
所有回答(4)
0

1.实现IRequiresSessionState 接口(空接口,只是标识当前handler需要session)

2.没看懂。

Daniel Cai | 园豆:10424 (专家六级) | 2016-09-29 00:34

1,只继承IRequiresSessionState 接口,要实现什么方法吗?

2,js脚本在发起Handler1的请求后,10秒就会发起Handler2的请求,Handler1里面执行的是一个长时间操作,Handler1代码我写的循环小而以,比如可能会执行10分钟。现在Handler2每隔10秒就会有一个请求,而这些请求不会得到影响,是在Handler1执行完成后,Handler2的那些请求才开始一一影响。所以就是我问的为什么他们两不是同步执行,这样Handler1执行,Handler2能获取到Handler1的执行进度了。

支持(0) 反对(0) wenbolwm | 园豆:131 (初学一级) | 2016-09-30 10:54

@wenbolwm: IRequiresSessionState只是一个标识,没任何方法需要实现

2.为什么不在handler1中不断的flush进度,还要额外搞个handler2来接管?

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-09-30 11:01

@Daniel Cai: 请问下怎么返回进度?

支持(0) 反对(0) wenbolwm | 园豆:131 (初学一级) | 2016-09-30 12:31
0

ashx如楼上所说,需要继承那个接口才可以用Session。。。

1执行完了才执行2的话,那你应该在1的回调函数里注册那个setInterval。。。

顾晓北 | 园豆:10898 (专家六级) | 2016-09-29 08:57

回答了楼下,在1执行完后才发起2的请求得到的是1处理完成的结果,我要是1执行的实时进度

支持(0) 反对(0) wenbolwm | 园豆:131 (初学一级) | 2016-09-30 10:56
0

一般处理程序中药操作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)
              }
                  });
                  
             });    

 

balahoho | 园豆:2050 (老鸟四级) | 2016-09-29 09:36

你这样写是Handler1.ashx里面的循环都执行完了,才去发起Handler2.ashx的请求,这样就没有了进度的效果,就是类似于我后面有大量数据操作,我页面上要显示当前处理到多少了。你那写是都处理完了,我再发起一个请求得到处理完的进度没有意思了。

支持(0) 反对(0) wenbolwm | 园豆:131 (初学一级) | 2016-09-30 10:38
0

ajax是异步请求,同步去执行的,不会等到第一个请求执行完了才会去执行第二个请求,session是NULL是因为你没有继承IRequiresSessionState这个接口

小白拜 | 园豆:111 (初学一级) | 2016-09-29 11:28

执行下来发现Handler2的请求不会立即影响而是在Handler1里面执行完成后Handler2才开始一一影响那些请求,这样就没有了页面实时显示Handler1的执行进度效果了

支持(0) 反对(0) wenbolwm | 园豆:131 (初学一级) | 2016-09-30 10:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册