会话状态在此上下文中不可用HttpModule中无法访问Session原因

写了一个自定义HttpModule,但始终访问不了Session,代码如下:

public class RouteModule : IHttpModule, System.Web.SessionState.IRequiresSessionState
{

    public void Dispose()
    {

    }

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

    void context_AcquireRequestState(object sender, EventArgs e)
    {
        var sessionNull = (sender as HttpApplication).Session == null;
        if (sessionNull)
        {

        }
    }}

如上,在AcquireRequestState 事件中Session始终是空,经多次调试发现,请求的是静态资源时Session就是为空,诸如aspx、ashx这类的动态资源Session就可以访问到,由此可见,只有在访问有处理程序映射的资源时才会加载Session否则不加载Session,因此在HttpModule中访问不到Session,这可能是IIS静态资源优化的一种方式。

时间: 2025-01-02 17:59:34

会话状态在此上下文中不可用HttpModule中无法访问Session原因的相关文章

C#的HttpModule中及Java的Servlet中成员变量乱用导致的不易重现的BUG

3年前写的在HttpModule中记录访问日志的代码,在最近使用日志数据分析登录账号的IP情况时,才发现了一个不易重现的BUG——日志中记录的登录账号出现串掉的情况.之所以这个时候才发现该问题,是因为部分用户的IP是固定的,但是日志里却出现了别人的IP.而之所以3年后才发现,是因为这块日志数据一直没怎么用过.回头想想,根本原因还是在用成员变量的时候没考虑到多线程的情况,或者说多用户同时访问的情况.因为HttpModule里的事件,是所有页面实例共用的. 问题代码: string dateBegi

请求在此上下文中不可用

项目环境:ASP.NET MVC 4 部属环境:WIN2008 X64 IIS7 异常详细信息: System.Web.HttpException: 请求在此上下文中不可用 解决方案一: 把Response.Request.Session写全: System.Web.HttpContext.Current.Response System.Web.HttpContext.Current.Request System.Web.HttpContext.Current.Session 解决方案二: Ap

ASP.NET的SEO--- Global.asax和HttpModule中的RewritePath()方法

本系列目录 因为在网上搜到了很多这方面的文章,而且UrlRewrite中SEO中的重要性也在逐步下降,所以这一节我就写得简单一些.以下是几个重点: 1.UrlRewrite,顾名思义,只是针对URL进行的重写操作,不要认为www.freeflying.com/Jack/articles-2467.html就真的对应着一个html文件:articles-2467.html:实际上,该链接真正对应的是www.freeflying.com/articles.aspx?author=Jack&id=24

Redis Sentinel高可用配置及C#访问

本文环境如下: 操作系统:ubuntu-14.04.1-desktop-amd64 Redis:2.8.19 如果使用虚拟机则将每台的网络设置为桥接,否则他们之间能连上,局域网连不上. 系统设计如图: 一.安装Redis 可以参考之前文章,采用离线安装,本次以Sentinel配置为重,所以以联网安装为例. 呼出ubuntu终端,依次执行下面命令: wget http://download.redis.io/releases/redis-2.8.19.tar.gz tar xzf redis-2.

mysql主主复制+keepalived高可用(使用VIP访问数据库提示不允许连接)

ERROR 1130 (HY000): Host 'nginx-vip' is not allowed to connect to this MySQL server mysql> GRANT ALL PRIVILEGES ON *.* TO 'slave'@'192.168.0.232' IDENTIFIED BY 'slave' WITH GRANT OPTION; Query OK, 0 mysql> use mysql; Reading table information for co

HttpModule & HttpHandler

ASP.NET 处理请求的过程 inetinfo.exe:www 服务进程,IIS 服务 和 ASPNET_ISAPI.dll 都寄存在此进程中. ASPNET_ISAPI.dll:处理 .aspx 文件的 win32 组件.其实,IIS 服务器只能识别 .html 文件的,当发现被请求的文件是 .aspx 文件时,IIS 服务器将其交给 aspnet_isapi.dll 来处理. aspnet_wp.exe 进程:ASP.NET 框架进程,提供 .net 运行的托管环境,CLR (公共语言运行

HttpModule与HttpHandler详解

ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会通过http管道(Http PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完毕将结果返回客户端.    inetinfo.exe进程:是www服务的进程,IIS服务和ASP

ASP.NET Global Application_Error事件中访问Session报错 解决

报错信息:会话状态在此上下文中不可用 protected void Application_Error(object sender, EventArgs e) { //以此判断是否可用Session bool HadInitSession = (sender as HttpApplication).Context.Session == null ? false : true; // ....... }

IHttpModule与IHttpHandler的区别整理

IHttpModule与IHttpHandler的区别整理1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的2.对请求的处理上:IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.3