日期:2014-05-20  浏览次数:20548 次

怎样在HttpModule捕获到session?
HttpModule如下:

 
public   void   Init(HttpApplication   context)
                {
                        context.AcquireRequestState   +=   new   EventHandler(context_AcquireRequestState);
                }

                void   context_AcquireRequestState(object   sender,   EventArgs   e)
                {
                        HttpApplication   application   =   (HttpApplication)sender;
                        string   url   =   application.Request.Url.ToString();

                        string   userName   =   Convert.ToString(application.Session[ "UserName "]);

......


application.Session[ "UserName "]出错:会话状态在此上下文中不可用

请问怎样在HttpModule中获得Session?   请帮忙,多谢了。。

------解决方案--------------------
帮顶
------解决方案--------------------
来学习
------解决方案--------------------
application.Session[ "UserName "]

TO

application.Context.Sesseion[ "UserName "]
呢.1.1 2.0?

------解决方案--------------------
不关HttpModule的事,而是事件引发顺序的问题,在AcquireRequestState事件引发时,Session对象还没有被创建,所以会有你的问题,看看这篇文章及其解决方案:

http://www.dotnetjunkies.com/Article/543AE98B-FD00-4064-B128-AB76E7BC34B3.dcik
------解决方案--------------------
楼主怎么不出来说一下
------解决方案--------------------
支持一下~
------解决方案--------------------
session生存期的问题了,你可以注意到在debug模式下session对象是null,因为在init时没有生成session对象.
------解决方案--------------------
必须继承自IRequiresSessionState这个标记接口。

任何需要读写Session的类都如此,无论你是IHttpModule还是IHttpHandler甚至是别的自定义类。
------解决方案--------------------
参考,请到MSDN查一下IRequiresSessionState的说明。

public class _Common_ClickCount : IHttpHandler, IRequiresSessionState
{
string _message = "//更新成功。 ";

public void ProcessRequest(HttpContext context)
{
string checkString = context.Request.QueryString[ "cs "];
if ((context.Session[ "CheckString "] != null) && (checkString == context.Session[ "CheckString "].ToString()))
{
this.ClickCountAddOne(Convert.ToInt32(context.Request.QueryString[ "id "]), context.Request.QueryString[ "table "], ref _message);
context.Session[ "CheckString "] = string.Empty;
}
else
{
_message = "//请求错误。 ";
}
context.Response.ContentType = "text/plain ";
context.Response.Write(_message);
}

public bool IsReusable