正常你应该要报异常的啊……
你需要把本机的stateserver开启,在控制面板--管理工具--服务里面找到state服务

解决方案 »

  1.   

    你先试下打开state服务好不……
      

  2.   


    你贴出的代码,Session["VIP"],不可能受这个“限制”。相反地,这是不让Session信息丢失的一种做法。
      

  3.   

    不好意思,我昨晚在家里,我也弄不了,就是看了一下session保存机制,今天我到公司看了一下他的服务是已经开启了的
      

  4.   


    你贴出的代码,Session["VIP"],不可能受这个“限制”。相反地,这是不让Session信息丢失的一种做法。
    代码的话挺多的,我就怕贴出来,太长了,人都不想看了。
    因为我另外的一个工程是能运行的,后来我吧上面这个WebConfig这个代码加上就不能用了。自定义控件前台js: function setValue(v,text) {
               $('#pBar0236').progressbar({
                   value: v
               });
               $("#pText0242").text(text);
           }
             function Star() {
               $("#pMain00123").show();
               $.ajax({
                   type: "post",
                   url: "/UserControls/ProgressServer.ashx",
                   success: function(data) {
                       var d = data.split("♀");
                       if (d[0] == "-1") { //停止
                           $("#pMain00123").hide();
                       } else {
                           setValue(d[0], d[1]);
                           setTimeout(function() { Star(); }, 5);
                       }
                   },
                   error: function(e) {
                       $("#pMain00123").hide();
                   }
               });
           }自定义控件后台: public void SetValue(int value,string txt)
            { 
                Session["McsBarValue"] = value;
                Session["McsBarText"] = txt;
                System.Threading.Thread.Sleep(10);
            }
            public void StarBar()
            {
                Session["McsBarValue"] = "0"; //这个是赋值成功的。
                Session["McsBarText"] = "";
                System.Threading.Thread.Sleep(10);
                string key = "js"+DateTime.Now.ToString("yyyy-MM-dd");
                ScriptManager.RegisterStartupScript(this, GetType(), key, "Star();", true);
               
            }        public void StopBar()
            {
                Session["McsBarValue"] = null; 
                Session["McsBarText"] = null;
            }用于接收ajax的ashx文件  public void ProcessRequest(HttpContext context)
            {
                if (context.Session["McsBarValue"] == null)
                {
                    context.Response.Write("-1♀-1");
                }
                else 
                {
                    context.Response.Write(context.Session["McsBarValue"] + "♀" + context.Session["McsBarText"]);
                }
            }上面其实是实现一个进度条,我前天发帖问了,但是没人说怎么弄,后来我翻了点资料自己弄了一个。
    上面的问题是:
    运行的时候,我把上面自定义控件放到一个页面webForm1.aspx,页面用线程开启,
    如下: protected void Button1_Click(object sender, EventArgs e)
            {
                 System.Threading.Thread th = new System.Threading.Thread(d);
                 pro.StarBar();//调式,发现这个时候 Session["McsBarValue"]赋值成了
                 th.Start();
            }
            private void d()
            {            for (int i = 0; i < 100; i++)
                {
                    pro.SetValue(i, "");//这个Session["McsBarValue"]也是赋值成了,但是在ashx里面的值都是“0”反正就是第一次赋值的值
                    System.Threading.Thread.Sleep(20);
                }
                pro.StopBar();
            }调用StarBar的时候    Session["McsBarValue"] = “0”;  这个赋值是对的
    然后调用SetValue以后,在赋值 Session["McsBarValue"] =“1” 我调试的时候,发现这个 Session["McsBarValue"] 也是等于1
    但是在ashx文件里面是 Session["McsBarValue"]=“0” 他一直都是0
    要是把上面的webconfig那个配置去了 又可以用了
      

  5.   

    我可能说的不怎么明白,他没有什么异常的,也没错误。
    就是 比如 第一次赋值
    Session["vip"]="1";
    这个时候值是有的,
    一会你在赋值 Session["vip"]="2";
    结果他的值还是1,就是第一次赋值的值,第二次赋值没有赋上
      

  6.   

    我怀疑过,但是怎么清楚缓存?
    不能把Seesion全都清了,因为那个其他的登陆信息还是用Session保存的,要是全清了,那一会进度条完成了,又得重新登陆了
      

  7.   


    断点跟的。   在用户控件里面调式看到 Session["McsBarValue"]一直都在变,但是在ashx里面看到Session["McsBarValue"]就是第一次赋值的值。拜托你说点实际的东西可以吗,每次遇到你,准没好事。我不知道别人是怎么样,反正我每次问的,一遇到你,你除了说一堆没用的东西,就走了,你这种人真招气。
    上回我问怎么弄得进度条,发了一贴,得,你回去扯了 你玩单机,拍拍屁股走人了。呵,你不说就不说呗,我自己去找资料,弄的差不多了,出问题了,我再问,妈的,你又来扯 什么单机。
    我的确什么都不懂,我也可以去学,你可以说我什么都不懂,说我哪里哪里有问题。我都能接受。
    但请你不要每次都故作高人似的扯一堆你自己发明的词语来糊弄别人(这个话是你自己说的),
    不管你说我玩单机也罢,我接受,但你好歹解释一下哪里不足,我可以去补足。你连解释一下都不解释。如果每个人都像你一样说完就走了或者你先看那个什么什么再说吧,那你说发这个贴问问题还有什么意义,直接取看书或者玩单机算了。你倒是把别人说的爽了,别人还在水深火热中呢,真不明白你是怎么想的。

      

  8.   

    我现在很理解sp1234为什么会只说些原理而完全不讲些实际的
    讲实际的看对谁讲
    如果讲了能懂,也可以讲一讲而你现在明显是完全不懂网站和单机到底有什么区别,
    不知道网页的生命周期
    不知道网站是天生多线程,天生是客户端和服务端通信的
    仅仅做过单机VS调试,完全没有部署到IIS上过
    不知道IE跟网站互相发送数据到底是怎么个过程提示你一下只是让你先稍微了解一些,可没有耐心从头到尾一步一步的给你细说,细说够出本书了
      

  9.   


    断点跟的。   在用户控件里面调式看到 Session["McsBarValue"]一直都在变,但是在ashx里面看到Session["McsBarValue"]就是第一次赋值的值。拜托你说点实际的东西可以吗,每次遇到你,准没好事。我不知道别人是怎么样,反正我每次问的,一遇到你,你除了说一堆没用的东西,就走了,你这种人真招气。
    上回我问怎么弄得进度条,发了一贴,得,你回去扯了 你玩单机,拍拍屁股走人了。呵,你不说就不说呗,我自己去找资料,弄的差不多了,出问题了,我再问,妈的,你又来扯 什么单机。
    我的确什么都不懂,我也可以去学,你可以说我什么都不懂,说我哪里哪里有问题。我都能接受。
    但请你不要每次都故作高人似的扯一堆你自己发明的词语来糊弄别人(这个话是你自己说的),
    不管你说我玩单机也罢,我接受,但你好歹解释一下哪里不足,我可以去补足。你连解释一下都不解释。如果每个人都像你一样说完就走了或者你先看那个什么什么再说吧,那你说发这个贴问问题还有什么意义,直接取看书或者玩单机算了。你倒是把别人说的爽了,别人还在水深火热中呢,真不明白你是怎么想的。


    +1
    我也那么觉得。。
    卧槽,我以前也是这样,问个问题不是蹭分的,就是大神理论,给他们这么一搞,问题没解决,帖子删除不了,可用分也拿不回来。想结贴,没有满意答案,不结贴别人一看,就说结帖率低....搞来搞去可用分都被搞光了,后来我干脆都不来这里问了,直接百度。
    其实问问题,本身就是先要解决问题才去交流...
    就比如1+1等于多少,你直接回答2就行了,要是心情好,你就告诉他为什么是2,要是心情不好,先说答案然后在骂这么简单的问题都问。要是觉得太简单玷污自己就干脆都不回..
    个人觉得,说理论固然好,但是那远水解不了近渴,说不定你说一下就能解决问题的,非要绕几圈。问题没解决怎么交流
      

  10.   

    我怀疑过,但是怎么清楚缓存?
    不能把Seesion全都清了,因为那个其他的登陆信息还是用Session保存的,要是全清了,那一会进度条完成了,又得重新登陆了     既然有可能是web.config的问题        那就看看stateConnectionString中的端口对不对     看看 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters/Port是不是42424     把stateNetworkTimeout设置长些   单位是秒
      
      

  11.   

    你没有调试你的 SessionID。在你的赋值和读取的四个方法那里,打印 SessionID 的值。只有它完全一样才可能读取出来值。首先你要确定这四个地方的 Session 集合是从同一个 SessionID 生成的。了解原理是个“捷径”。如果不知道原理,就会反反复复地瞎猜答案,而不知道自己如何调试。
      

  12.   

    嗯,这里就算是 SessionID 一致,也会在出现线程问题。 你说你在 InProc 模式下赋值之后就能用,而 StateServer 模式下就不能用,有时间我可以测试一下。但是从基本的原理出发就知道,当页面处理结束时页面的Session集合内容就会复制回整个网站的Session集合,那么当页面主流程都结束之后你还在写Session集合,这并不应该能够写回整个网站的Session集合中。那么其它页面读取Session集合,应该不包括你在 d() 方法中写的数据。不要在网页里随便启动线程方法。asp.net的默认机制并没有支持使用线程,除非你懂得asp.net的机制从而知道如何在出现问题时去从这个角度自己去做测试,否则你就会在asp.net页面下发现一切asp.net编程常识都不一样了。。
      

  13.   

    对于你的问题,你可以把进度数据写到数据库中、Cache中、或者全局static变量中。然后在你的ashx中读取出来。如果你觉得一个页面已经结束了(已经输出html给客户端了)然后又可以无限期地搞个线程在服务器上循环着,先不说这会不会轻易搞垮服务器,单就这个逻辑来说——即使是做测试,其实也——就不太真实。真实的应用,应该是某个真实的操作触发了某个事件去更新这个进度数据。而asp.net程序员可知道的“触发”操作非常有限。比如说客户端提交了一块数据,从而在服务器端保存到文件中,那么你想想看的 d() 方法能够执行这类操作吗?你的进度条数据应该由具体干事儿的另外的程序去设置,而不是你的 d() 方法来设置。如果你需要模拟这种方式来看看进度条的效果,你应该编写一个由客户端定时发起的、并且传送数据块(而不是整个数据)的程序,当这个运行之后,才能看到演示效果。或者说,你可以写一个页面,访问 http://localhost/setPro.aspx?n=38  这类,就能修改这个进度数值。用这个方法手动在浏览器上不断修改 n 参数值,这样测试也行。而不需要写一个没法代表真实操作的子线程测试。
      

  14.   


    好吧,先谢了。我这个其实是 做一个从excel读取一大堆数据的操作,这个是一个单独的模块,我正式用的时候,是把进度条放在这个模块里面设置的。上面说的SessionID是一致的。现在我知道问题所在了,在Session默认的情况下 (inPro),是允许 在同一进程内,还可以通过对象引用访问。
    但是mode设置为StateServer后,数据存到了其它进程中,你的线程得到的只是一个代理对象、是复本。不再有引用类型的特征。
    所以我的线程d 操作的Session[]相当于一个 值类型的 东西,
    所以就有了 我在默认InProc 下程序跑的正常,设置StateServer就用不了的情况
    我现在把Session改成了Application,然后用SessionID作为Application的key值,能用是能用了,就是不知道会引发什么其他问题,我读书的时候老师说最好不要用Application.
    先暂时用着。
      

  15.   

    Session在多线程里的时候是访问不到的,因为它没有上下文!