none
在自定义模块(实现IHttpModule接口)使用HashTable存储,那么HashTable中的数据是每个访问者都可以得到吗? RRS feed

  • 问题

  • 在自定义模块(实现IHttpModule接口,针对hello.aspx)使用HashTable存储,那么HashTable中的数据是每个访问者都可以得到吗?

    还是针对一个访问者?能不能具体讲解下HashTable的应用,和使用对应的环境?

    2010年5月13日 5:30

答案

  • 应该是这么回事.

    因为HttpModule这个类的对象是有ASP.NET这个体系的核心来创建的,

    这属于底层了.

     

    问题在于你ASP.NET底层如何创建的HttpModule这个类的对象.

    被创建的对象是Private的还是Public的.

    被创建的对象如何引用.

     

    这些都是个问题.

     

    Session的数据是因为给附加到当前的HttpContent里去了.

     

    其实Session是可以像Application那样的.

     

    只是被隐藏的底层代码,然后又能随便的改.

     

    哎.

     

    太不灵活了.

     

    用Static吧.

    没辙.

    2010年5月13日 9:03
  • 你好,

    hashtable没有什么特定的使用环境,它就是以名值键对的方式来保存object。

    e.g.

    HashTable ht=new HashTable();
    ht["first"]="first";

    在ASP.NET中所谓的全局变量,主要是session和application和Cache三个,也可以用static变量用做全局变量。但是如果用static容易导致死锁,出现一些奇怪的问题。

    所以你所说的hashtable是否每个访问者都能得到,得看你是怎么定义的,怎么保存的。如果用application或者cache或者静态变量的方式再保存下肯定是每个人都可以访问的,用session就只能当前用户能访问了。


    Microsoft Online Community Support
    2010年5月17日 2:14
  • 针对一个用户的。

    HashTable是个key value的键值对。

    你可以放在Application里面,这样所有访问者就可以去访问这个HashTable了。


    别人笑我忒疯癫,我笑别人看不穿; 不见五陵豪杰墓,无花无酒锄作田。
    2010年5月17日 2:39

全部回复

  • 应该是这么回事.

    因为HttpModule这个类的对象是有ASP.NET这个体系的核心来创建的,

    这属于底层了.

     

    问题在于你ASP.NET底层如何创建的HttpModule这个类的对象.

    被创建的对象是Private的还是Public的.

    被创建的对象如何引用.

     

    这些都是个问题.

     

    Session的数据是因为给附加到当前的HttpContent里去了.

     

    其实Session是可以像Application那样的.

     

    只是被隐藏的底层代码,然后又能随便的改.

     

    哎.

     

    太不灵活了.

     

    用Static吧.

    没辙.

    2010年5月13日 9:03
  • 不是吧,这也算底层。。。。

    就是个应用程序模块嘛。Session不是针对用户的吗?当每个用户开始访问该网站时,就会被分配一个session,并分配一个id那么,并只有该用户能访问它。

    当然是public

    2010年5月13日 14:43
  • 你好,

    hashtable没有什么特定的使用环境,它就是以名值键对的方式来保存object。

    e.g.

    HashTable ht=new HashTable();
    ht["first"]="first";

    在ASP.NET中所谓的全局变量,主要是session和application和Cache三个,也可以用static变量用做全局变量。但是如果用static容易导致死锁,出现一些奇怪的问题。

    所以你所说的hashtable是否每个访问者都能得到,得看你是怎么定义的,怎么保存的。如果用application或者cache或者静态变量的方式再保存下肯定是每个人都可以访问的,用session就只能当前用户能访问了。


    Microsoft Online Community Support
    2010年5月17日 2:14
  • 针对一个用户的。

    HashTable是个key value的键值对。

    你可以放在Application里面,这样所有访问者就可以去访问这个HashTable了。


    别人笑我忒疯癫,我笑别人看不穿; 不见五陵豪杰墓,无花无酒锄作田。
    2010年5月17日 2:39
  • 其实不光是HashTable对象,任意对象在HttpModule里定义,貌似都是全局的.

    有兴趣的可以研究下.

     

    1.自定义HttpModule模块(关键)(在这个模块里定义一个Private或Public非static的对象)

    逻辑代码,

    if(object==null)

    {

    object=123;

    session["abc"]=null;

    }

    else

    {

    session["abc"]=object;
    }

    2.用这个自定义模块取代FrameWork的必须模块(关键)(比如FrameWork的Session建立模块,具体名我忘记了,可查查)

     

    3.实际运行.

    你会发现,第一个Web用户访问时,Session["abc"]等于null,而第二个Web用户访问时,Session["abc"]等于123.

     

     

    也就是说,B用户读取到了A用户的对象值,然而核心问题是该对象非Static!!!

     

    初步估计是因为HttpModule类是由IIS进程或应用程序池实例化的.

     

    然后只要IIS进程或应用程序池进程不崩溃,自定义的HttpModule类所对应的实例对象就一直存在!

     

    然后.

    嗯.

    呵呵.

    FrameWork的Session持久模式中的InPro估计差不多就这样的吧..

    猜测..

    2010年6月8日 8:41