Jews

【Oracle dba,人类心理行为学,人类记忆学,e文学习】 【ASP.NET Team:27565311 】 【Oracle dba Team:53489331 加入请说明原因】

  博客园 :: 首页 ::  :: 订阅 订阅 :: 管理
  115 Posts :: 1 Stories :: 1888 Comments :: 46 Trackbacks

     说起来,真的是惭愧,一直以为Session不能用在自定义的CS类中(aspx的后台CS文件之外的类文件),我之所以是这么想,是因为在自定义类文件中,直接输入Session,编译器没有智能感应;再者,我请教了某个"高手",高手说"怎么可能,CS类文件没有经过asp.net HttpModule管线,系统没有加载会话状态,所以自定义的类文件中,决不能使用Session",细细想来,觉得也没什么不妥当的地方,于是便默认了他的这种观点(你是不是也还这样想呢?).

     于是,我经常埋怨Asp.net之父ScottGu,埋怨他为什么要这样设计?如果我要在中间件类库中使用会话状态,却不能使用,启不是很痛苦?(我埋怨他很长一段时间,其实我错了,他没有错,sorry)

     仔细想想,发现我的思路,似乎被那"高手"引导到了一条错误的路线上,cs文件似乎与asp.net HttpModule管线没什么关系.因为,只要http请求的资源符合asp.net筛选器,asp.net runtime就会在http管线中,经过HttpMoudule的某个点,请求生成会话状态,所以,可以推断,会话状态对象与类文件无关.

实验一,在App_Data内部类文件中,使用会话状态

 

public class TestClass
{
    
    
    
public TestClass()
    
{
        
    }

    
public void GetSession()
    
{
        HttpContext.Current.ApplicationInstance.Session[
"name"= "王孟军";
    }

}

 

实验二,在网站外的类库中,使用会话状态

 

using System;
using System.Collections.Generic;
using System.Text;

using System.Web;

namespace TessClassLib
{
    
public class Class1
    
{
        
public void GetSessionLib()
        
{
            HttpContext.Current.ApplicationInstance.Session[
"otherName"= "郭孟军";
        }

    }

}

 

页面类文件调用情况

 

protected void Button1_Click(object sender, EventArgs e)
    
{
        TestClass ts 
= new TestClass();
        ts.GetSession();

        Class1 c 
= new Class1();
        c.GetSessionLib();

        Response.Write(Session[
"name"].ToString() + "---" + Session["otherName"].ToString() );
    }

效果

很明显,我的想法是正确的,在内部类和外边类都可以使用会话状态,只不过获取她的方式不同而已.

使用Session需要注意的几个地方

     有朋友喜欢自己实现IhttpModule,以便在运行时,能做一些控制,其实只有在context.AcquireRequestState事件的委托方法中,或者她后面的委托方法中才能使用会话状态,如果在他之前调用Session,自然会抛出nullException.

     如果要在自己定义IhttpHandler中使用会话状态,务必要实现IRequiresSessionState接口.

总结

       虽然这个话题,对某些高手而言,只不过是一雕虫小技耳,但还是希望对那些困惑的朋友,有所启发,有所帮助(代码实在简单,就不提供下载了)

posted on 2008-10-08 01:57 Jews 阅读(2767) 评论(29)  编辑 收藏 网摘 所属分类: [2] asp.net

Feedback

#1楼 2008-10-08 02:00 张明海      
本来我一直不说话的 不过被你感动了 沙发下 2点了 睡觉吧 兄弟 我是没办法 我们东西测试了要上传等大家一起走 就近来转转了
  回复  引用  查看    

#2楼 2008-10-08 03:42 Fenrir      
HttpContext.Current.Session 不就行了?
  回复  引用  查看    

#3楼 2008-10-08 06:23 戏水 ~[未注册用户]
我是失眠了,没办法~~
  回复  引用    

#4楼 2008-10-08 08:21 子逸      
记住: 哪都可以用 Session
  回复  引用  查看    

#5楼 2008-10-08 08:34 横刀天笑      
@子逸
你说错了,并不是哪里都可以用Session
对于asp.net的Page页面的后台代码,如果Session没有关闭可以用
对于实现IHttpHandler的处理器,还要实现一个IRequiresSessionState接口,其实这个接口是一个空的,只是做个标记(我倒觉得这里不应该作为一个接口,.net里面有Attribute,为啥要这样作为标记的空接口呢?)
在HttpModule的有几个事件里也不能用Session,因为那个时候SessionModule这个模块还没有加载进来

  回复  引用  查看    

如果你的头像是你儿子的话,你们两个长得还真是不是一般的像阿!
呵呵!!恭喜楼主有一个好儿子啊!

  回复  引用    

#7楼 2008-10-08 09:08 玄天尊的小屋      
不錯不錯 http://www.cnblogs.com/chenxizhang/archive/2008/08/27/1277274.html" target="_new">http://www.cnblogs.com/chenxizhang/archive/2008/08/27/1277274.html
這篇文章可以參考下:)

  回复  引用  查看    

#8楼 2008-10-08 09:09 xiao_p      
细节 决定成败。。。
呵呵

楼主的 大光头怎么不见了?

  回复  引用  查看    

#9楼 2008-10-08 09:17 颜斌      
我晕 我还以为是啥问题...
  回复  引用  查看    

#10楼 2008-10-08 09:21 囧[未注册用户]
看到这样的文章,我只想哭..Cnblogs首页坠落成这样了-_-#!!这样的文章放新手页去吧。。
  回复  引用    

#11楼 2008-10-08 09:44 游侠_1      
细节决定成败
  回复  引用  查看    

#12楼 2008-10-08 09:53 风中的猪儿      
又见光头大哥,最近我也剃了光头,嗯嗯,可以用来色诱他人了^_^
  回复  引用  查看    

#13楼 2008-10-08 09:58 Anytao      
@横刀天笑
@Fenrir

对,在实现自定义HttpHandler时,默认情况下你是没有访问Session权限的,HttpContext.Current.Session也会返回为null,解决的办法正像横刀天笑说的:

引入System.Web.SessionState命名空间:

public classs CustomHandler: IHttpHandler, IRequiresSessioinState
{
//...
}

  回复  引用  查看    

#14楼 2008-10-08 10:24 王立斌      
哈哈,入门的时候就解决过的问题。
  回复  引用  查看    

#15楼 2008-10-08 10:26 mizuno[未注册用户]
早被这些首页党折服了。
  回复  引用    

#16楼 2008-10-08 10:37 Steven Chen      
@Anytao
你的回复倒是值得一看

  回复  引用  查看    

不会吧,基础
  回复  引用    

#18楼 2008-10-08 10:43 昊子      
首先C#的主體是類不是cs文件,在CLR中沒有文件這一說。

HttpHandler管線中(包括Page)使用Session也是訪問線程安全的靜態對象,跟其他能夠使用HttpContext的類沒有區別。

如果要研究Session,不要研究HttpSession,研究HttpContext


  回复  引用  查看    

被人称作首页党,哈哈~
不过这的确是基础

  回复  引用    

#20楼 2008-10-08 11:18 mrfangzheng      
Session是Web的东东
尽管语法上可以随处使用
但还是尽量只在UI层使用
如果在数据访问层用的话
你的程序就依赖于web了

  回复  引用  查看    

#21楼 2008-10-08 11:24 长河落日      
mark
  回复  引用  查看    

#22楼 2008-10-08 12:05 一舟      
赫赫,有意思,今天刚刚看到国外一个成型产品里,也把Session写到类库里,用来统计在线人数,里面用Session.SessionID做key值.

不过有个问题,关于Session.SessionID,我建立一个测试页面,每刷新一次,它的值都会变.

  回复  引用  查看    

說到原因了。
  回复  引用    

#24楼[楼主] 2008-10-08 12:33 王孟军!      
@一舟
----------------------------------------------
不过有个问题,关于Session.SessionID,我建立一个测试页面,每刷新一次,它的值都会变
------------------------------------
你给Session付个值,就不会变了

  回复  引用  查看    

#25楼 2008-10-08 15:05 小兽      
嗯 以前也有这个疑问!
现在明白了

  回复  引用  查看    

内容没怎么看,被标题的语法吸引了
  回复  引用    

#27楼 2008-10-15 16:38 xjb      
Session 一般用于UI层,不建议在下层调用,这样思路会比较混乱
  回复  引用  查看    

#28楼 2008-12-04 23:56 Jimmy Zhang      
@xjb

同意,Session 用在下层的话,下层模块就不通用了,仅限于Web项目,一般下层模块只接收Session的值,而不是Session对象。


  回复  引用  查看    

#29楼 2009-03-05 18:32 sliwen      
今天也碰到了同样的问题,按照楼主的解决方法,顺利完成了,在自定义的HttpHandler类上实现IRequiresSessionState接口就可以使用Session了,之前的HttpContext.Current.Session一直为Null。
  回复  引用  查看    

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1305981




相关文章:

相关链接: