Session为空的问题.求助

amwihiud 2012-04-14 06:18:06
小弟最近学习框架的做法.重写了httpModule中的方法.并在Web.config中设置了

<httpHandlers>
<clear />
</httpHandlers>
<httpModules>
<clear />
<add name="HttpModule" type="Xy.Web.HttpModule,Xy.Web" />
</httpModules>

所以导致Session为null(注意,是Session为null 不是Session["xxx"]为null);
基本的猜想可能是因为重写了.net处理页面的方式.导致Session没有被正确的初始化..试过两个方法.一个是用
HttpApplication.Context.Session

另一个是用
HttpContext.Current.Session

都为null.请教如何才可以把这个Session初始化呢..
另外..能否有大侠告知下.net的Session实现原理....?
...全文
501 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
amwihiud 2012-04-23
  • 打赏
  • 举报
回复
星期一了.坐等高手解答Session_End事件实现方法....
amwihiud 2012-04-20
  • 打赏
  • 举报
回复
只是为了让这个框架符合以往的开发习惯而已....
  • 打赏
  • 举报
回复
坐等成果!
amwihiud 2012-04-19
  • 打赏
  • 举报
回复
怎么还没有人...求解怎么实现Session_End事件呐~~~~!!
woainilei 2012-04-19
  • 打赏
  • 举报
回复
从写了session真得对网站有很大的帮助吗?看不明白也没有楼主和大牛的想法。学习了。
zhangpinguknow 2012-04-16
  • 打赏
  • 举报
回复
你的那个写法有个问题,就是如果用户正在访问(已经写过cookie)的时候回收IIS.将导致有cookie没session的情况.会报错崩溃

在处理该请求时将由 HttpApplication 类执行以下事件。希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。

1.对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见 ValidateRequest 和脚本侵入概述。
2.如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。
3.引发 BeginRequest 事件。
4.引发 AuthenticateRequest 事件。
5.引发 PostAuthenticateRequest 事件。
6.引发 AuthorizeRequest 事件。
7.引发 PostAuthorizeRequest 事件。
8.引发 ResolveRequestCache 事件。
9.引发 PostResolveRequestCache 事件。
10.根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实     例之前对其进行编译。
11.引发 PostMapRequestHandler 事件。
12.引发 AcquireRequestState 事件。
13.引发 PostAcquireRequestState 事件。
14.引发 PreRequestHandlerExecute 事件。
15.为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。
16.引发 PostRequestHandlerExecute 事件。
17.引发 ReleaseRequestState 事件。
18.引发 PostReleaseRequestState 事件。
19.如果定义了 Filter 属性,则执行响应筛选。
20.引发 UpdateRequestCache 事件。
21.引发 PostUpdateRequestCache 事件。
22.引发 EndRequest 事件。

*:AcquireRequestState事件,当实际服务请求的处理程序获得与该请求关联的状态信息时发生。在这个事件发生时才能取到Session中是x信息。

BeginRequest事件在AcquireRequestState之前发生,我们把取Session状态的代码放在BeginRequest中肯定是取不到的。

因此将以上代码放在AcquireRequestState事件里,应该是可行的
amwihiud 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

坑挖的有点深。。。不敢跳。。
[/Quote]
此话怎讲...
小茶杯 2012-04-16
  • 打赏
  • 举报
回复
坑挖的有点深。。。不敢跳。。
amwihiud 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

你的那个写法有个问题,就是如果用户正在访问(已经写过cookie)的时候回收IIS.将导致有cookie没session的情况.会报错崩溃

在处理该请求时将由 HttpApplication 类执行以下事件。希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。

1.对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参……
[/Quote]
是的..不过这个问题已经在我搬来的代码里被修复了...
更改代码的位置在这个项目不太可行..
现在还有一个问题...在.net的Golbal里是有一个Session_End的事件的..我不知道这个事件该怎么实现...
amwihiud 2012-04-15
  • 打赏
  • 举报
回复
附上我的实现方法.有什么错误.或是更好的建议请指出.

public class PageSessionCollection : IPageSessionCollection {

private static Dictionary<string, IPageSession> _sessionCollection;
private static PageSessionCollection _instance;

private PageSessionCollection() {
_sessionCollection = new Dictionary<string, IPageSession>();
}
public static PageSessionCollection GetInstance() {
if (_instance == null) {
_instance = new PageSessionCollection();
}
return _instance;
}

public int CreateSession() {
string Key = Guid.NewGuid().ToString();
System.Web.HttpContext hcr = System.Web.HttpContext.Current;
hcr.Response.Cookies.Add(new System.Web.HttpCookie("XyFrameSession", Key) { Expires = DateTime.Now.AddMinutes(Xy.WebSetting.SessionOutTime) });
_sessionCollection.Add(Key, new PageSession());
return _sessionCollection.Count;
}
public IPageSession GetSession() {
string Key;
System.Web.HttpContext hcr = System.Web.HttpContext.Current;
if (hcr.Request.Cookies["XyFrameSessionId"] == null) {
CreateSession();

}
Key = hcr.Request.Cookies["XyFrameSessionId"].Value;
return _sessionCollection[Key];
}
}

public class PageSession : IPageSession {

private System.Collections.Specialized.NameValueCollection _session;

public PageSession() {
_session = new System.Collections.Specialized.NameValueCollection();
}

public string this[string index] {
get {
return _session[index];
}
set {
if (_session[index] == null) {
_session.Add(index, value);
}
}
}
}

自己开发这个框架是为了不改变大家编程习惯的前题下剩去.net对页面及页面控件繁琐的解析过程.事实上很多的.net网站已经开始不使用"runat = server" 的控件了.而我的框架就是以剩去这些控件的解析过程为目的的.但是其他的东西我依然得照搬.就比如这个Session...
等我开发完成以后会免费供大家使用.希望能得到大家的支持
amwihiud 2012-04-15
  • 打赏
  • 举报
回复
木有人来看看么...?
amwihiud 2012-04-14
  • 打赏
  • 举报
回复
回各楼:
我做这个框架的目的是想跳过.net处理页面的各种繁琐过程.所以在beginRequest这个方法里我就会直接把页面内容输出request.end了..在这个前题目下我没办法将我的页面类放到AcquireRequestState或是PreRequestHandlerExecute中去.
今天晚上出去办了点事.一路上一直在想这个问题.为了向大家证明我不是一个伸手党.所以和大家分享一下我解决问题的思路

首先是使用.net自己的Session.但同时又要避开他进行其他冗余的操作.既然Session是在AcquireRequestState开始的.那是否可以用Reflector反编译下System.Web然后找出这个方法进行Session的初始化工作.其实这个方法下午的时候就想过.只是因找不到方法而以失败告终..不知哪位大侠能分离出.net Session初始化的方法还请指点迷津

再者是自己实现Session.我知道.net的Session有三种模式.一种是存在IIS进程池里.一种是aspnet_state里.还有一种是数据库里.三种都要实现的话有点麻烦.我的框架是面向小型企业站的.一般情况下用默认的存在IIS里就行了.回想能存在里面的也就只有静态变量了.于是写了两个接口

public interface IPageSessionCollection {
int CreateSession();
IPageSession GetSession();
}
public interface IPageSession {
string this[string index] { get; set; }
}

实现的策略是使用单例模式在PageSessionCollection中放一个Dictionary<string, IPageSession>,在int CreateSession()中生成一个唯一的Key写入指定的cookie里面.然后再生成一个PageSession连着这个Key一起放入Dictionary<string, IPageSession>里.当使用GetSession的时候先在指定的cookie里读取这个Key.然后再通过这个KEY到Dictionary<string, IPageSession>里读到属于该用户的PageSession.
PageSession里只要放一个值键对就可以了.
使用单例模式的原因是避免创建多个Session池而导致用户读取不到正确的Session值.没有使用静态方法是因为使用了接口.之所以使用接口是因为原本.net的Session有三种模式.我只写了一种.剩下的两种用户可以通过接口自己实现.

以上的方法没有经过测试.不过理论上应该已经实现了Session的IIS模式.并且这个Session被规定为只可以放字符串.

不知各路大侠是否有更好的建议.还请指教
  • 打赏
  • 举报
回复
同意#3楼。

要知道InProc模式下的Session集合的值随时会因为各种网站压力而丢失,所以像csdn这样的网站我想他们都不会去使用Session集合的。

孟子E章 2012-04-14
  • 打赏
  • 举报
回复
如果在HttpModule中使用session,则必需在加载在

HttpModule.AcquireRequestState()
|
HttpModule.PreRequestHandlerExecute()

否则是读取不到Session.

参见
http://forums.asp.net/p/1098574/1665773.aspx
bonnibell 2012-04-14
  • 打赏
  • 举报
回复

public class SessionModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += BeginTransaction;
context.EndRequest += CommitAndCloseSession;
context.PreRequestHandlerExecute += PreRequestHandlerExecute;
}



public void Dispose() { }

public void PreRequestHandlerExecute(object sender, EventArgs e)
{
var context = ((HttpApplication)sender).Context;
context.Session["some_sesion"] = new SomeObject();
}
...
}


放到 PreRequestHandlerExecute 中

http://topic.csdn.net/u/20071026/11/6fa7745b-daf6-46b0-8d7c-3baf4b4fa397.html
amwihiud 2012-04-14
  • 打赏
  • 举报
回复
http://www.cnblogs.com/shitou/archive/2011/01/21/1941082.html

刚查到一点资料.似乎如果重写beginRequest的话是没办法获取到Session的..那是否有办法自己实现Session呢..因为实在不想加入.net的处理流程

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧