IIS7.0 下使用Intelligencia.UrlRewriter时Session为空问题

背景


新年伊始,本人的开发环境由Windows Server 2003 +IIS 6 升级成了 Windows Server 2008 +IIS
7,之后便着手参加新项目的开发。
项目开发后期测试过程中,发现了这么一个问题,那就是使用Intelligencia.UrlRewriter做伪静态的时候,ASP.NET
Session为空的问题。
ASP.NET 异常截图如下:

后来在网上无意间查到解决方案,就是在system.webServer配置节,设置modules节点的属性runAllManagedModulesForAllRequests为“true”。知其然必须要知其所以然,否则下次还是会遇上同样的问题。

IIS集成模式和经典模式


1.经典模式

在IIS 6.0中的经典模式中,ASP.NET是一个添加到IIS中的ISAPI。IIS
7.0之所以支持这种模式,是为了做到向后兼容。经典模式缺少许多集成模式才能提供的特性。在经典模式中,IIS拥有自身的管道,这些管道可以通过创建一个ISAPI扩展进行扩充,而ISAPI扩展是以难以开发而著称的。ASP.NET作为一个ISAPI扩展运行,只是IIS管道中的一项组成部分。

2.集成模式

利用集成模式,可以将ASP.NET作为IIS的有机组成部分。现在,IIS服务器的功能被划分为40多个模块,因此也就将IIS和ASP.NET的功能划分为不同的组成部分。诸如StaticFileModule、BasicAuthenticationModule、FormsAuthentication、Session、Profile,以及RoleManager等模块都是IIS管道的组成部分。而FormsAuthentication、Session、Profile,以及RoleManager原本就是ASP.NET的组成部分,与IIS并无关系。

我个人认为,集成模式很好的复用了代码,而不关心这些代码是native
code 或者是 managed code.

IIS应用程序的配置系统

IIS的配置是可以继承的,通常情况下,父节点的配置,会作为子节点的默认配置。当然,子节点的配置也是可以重写父节点的配置的。整个继承体系如下图所示:

如图所示,其中.net framework
root的配置我们可以在%windir%\Microsoft.NET\这个目录底下找到:



而IIS本身的配置,则被放置在了%windir%\System32\inetsrv\config这个目录下:



这个ApplicationHost.config,里面包含了整个IIS服务器所有特性的配置——应用程序池,站点,应用程序以及虚拟目录...



IIS的每一个配置节,都是可以锁定的。一旦锁定了,站点以及站点之下的应用程序都不能重写。要锁定某一个配置节,你只能通过appcmd.exe这个IIS自带的管理工具去设置,详细使用方式不再本次讨论之内。另外,在modules的每个子节点,我们可以看到有一个preCondition的属性。这个属性指定该module运行的条件。只有在条件满足的情况下,这个module才会被执行。

当然你也可以通过设置modules节点的属性runAllManagedModulesForAllRequests为“true”,强制所有的module在任何条件下执行。关于module的preCondition更多的属性值,可以参考MSDN:http://www.iis.net/configreference/system.webserver/modules/add

回到一开始的问题上,Session为空,程序没有异常,那么问题就出在做伪静态的URL重写。IIS判断伪静态页面请求不满足Session这个配置节的默认的运行条件:managedHandler,就是说IIS认为这个请求只是请求一个静态文件。
问题找到了,那么一共有两种解决方案,一种是重写这个session
module的配置;一种就是设置modules节点的属性runAllManagedModulesForAllRequests为“true”,强制所有的module在任何条件下执行。

参考文章:
http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/50218981-e9e0-49b1-933c-b35a2de6fdde
http://book.51cto.com/art/200908/146143.htm
http://www.iis.net/configreference/system.webserver/modules/add

时间: 2024-11-02 01:56:59

IIS7.0 下使用Intelligencia.UrlRewriter时Session为空问题的相关文章

IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求

IIS7.0下查询条件太多时,会报错,因为IIS 7对于Query String有长度限制.默认为2048 错误信息如下: TTP 错误 404.15 - Not Found    请求筛选模块被配置为拒绝包含的查询字符串过长的请求. •Web 服务器上的请求筛选被配置为拒绝该请求,因为查询字符串过长.可尝试的操作:•确认 applicationhost.config 或 web.config 文件中的configuration/system.webServer/security/request

IIS7.0下发布ASP程序报错

操作系统:Windows server 2008 X64 Web: IIS 7.0 任务: 发布Asp程序 首先,要通过OS自带的服务器管理器-->角色-->添加角色-->Web服务器(IIS),选中相对应的选项安装.Win8自带了程序包,比先前系统更方便.在这里安装过程省略了,重点还是解决发布ASP程序的过程中遇到的问题. 其次,发布ASP程序时注意的几个事项: 1)    新建网站时会自动建立相对应的应用程序池,可是先前IIS版是没有这个自动功能的. 2)    应用程序池-->

ThinkPHP5.0下,利用Cookie和Session来存储用户信息

利用tp5框架封装好的Cookie类和Session类.若发现过期时间没有生效,可以试试清除缓存. 登录页面Login.php <?php/** * Created by PhpStorm. * User: zjl * Date: 2018/11/1 * Time: 15:21 */namespace app\admin\controller; use think\Controller;use think\Request;use think\Session;use think\Cookie; c

Windows-Server-2008、IIS7.0环境下配置伪静态化

在Windows-Server-2008.IIS7.0环境下配置伪静态化 首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为7.0,我们知道,IIS7.0与IIS6.0 的操作界面差别较大,如图(1)所示: 1.IIS7.0操作界面: 图(1) 2 新建网站同时新建应用程序池与网站对应,注意,在IIS7下新建网站之后,程序会自动新建应用程序池与之对应: 不需要再新建应用程序池.如图(2): 图(2) 3  添加网站详细页面如图(3)所示: 图(3)

发布.net 4.0的站点到IIS7.5下时无法访问

现象: 初始发布.net 4.0站点到IIS7.5下时,各种配置都完毕的情况下依旧无法访问.首页显示站点目录结构(注:开启目录结构访问后会显示这个错误,否则会提示开启),访问次级目录提示:Handler “PageHandlerFactory-Integrated” has a bad module “ManagedPipelineHandler” in its module list错误. 解决方案: 1.需要在目标服务器上重新注册下: %windir%\Microsoft.NET\Frame

SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

其他信息: V5.7.4.4 Can't find the System.Data.SQLite.dll more info : 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集. 解决办法,web.config 添加

C#连接Sqlite 出现:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。的解决方案

C#连接Sqlite 出现: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集.的解决方案 C#连接sqlite数据库代码: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Data.SQLite; 6 using System.D

如何在IIS7.0环境下配置ShopNum1分销系统静态化

近来遇到有许多用户已经更换了最新的操作系统,那么,在新的操作系统.新的环境下,究竟 应该如何配置ShopNum1分销系统呢?下面,我们来为大家详细介绍一下如何在Windows Server 2008.IIS7.0环境下配置ShopNum1分销系统:        首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为7.0,我们知道,IIS7.0与IIS6.0   的操作界面差别较大,如图所示:     1.IIS7.0操作界面:     2 新建网站同

【转】Sqlite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...

开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集 其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了