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
IIS7.0 下使用Intelligencia.UrlRewriter时Session为空问题的更多相关文章
- IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求
IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求 IIS7.0下查询条件太多时,会报错,因为IIS 7对于Query Str ...
- 关于 IIS7.0下文件写入无权限的解决办法
1. 在IIS Web站点上右键 --> 编辑权限 2. 在弹出的窗体上选择[安全]选项卡,如图: 3. 在安全选项卡中点击[编辑]按钮,弹出如图对话框: 4. 点击[添加]按钮,弹出如图对话框 ...
- ASP.Net上传大文件解决方案之IIS7.0下的配置
开源的Brettle.Web.NeatUpload.在公司IIS6.0使用正常,但是在Windows 2008 server IIS7上使用不正常.在网上看到一个解决办法但是没有效果 IIS 7 默认 ...
- DtCMS 在IIS7.0 下之伪静态
1)首先新建一个应用程序池,名称任意,比如:nettest,托管管道模式先暂时设置为集成模式,等下面的一系列设置完成之后再设置成经典模式: 2)部署好站点,并将此站点的应用程序池设置为nettest; ...
- 使用PsExec tool在Session 0下运行程序
在Service程序中使用OutputDebugString输出log信息, 在当前用户直接运行DbgView.exe, log信息是不会输出到DbgView窗口的.原因是Server程序运行在Ses ...
- Windows-Server-2008、IIS7.0环境下配置伪静态化
在Windows-Server-2008.IIS7.0环境下配置伪静态化 首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为 ...
- Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略
在项目中,之前公司是使用IIS 7.0官方的URL重写模块,官方的使用说明请参见官方URLRewrite ,添加伪静态支持,后来经理问我有没有涉及伪静态,我说之前项目中我一直是用Intelligen ...
- 发布.net 4.0的站点到IIS7.5下时无法访问
现象: 初始发布.net 4.0站点到IIS7.5下时,各种配置都完毕的情况下依旧无法访问.首页显示站点目录结构(注:开启目录结构访问后会显示这个错误,否则会提示开启),访问次级目录提示:Handle ...
- .NET4.0下网站应用法度用UrlRewriter.dll重写无后缀路径 (在IIS7.5中的设备办法)
.NET4.0下网站应用法度用UrlRewriter.dll重写无后缀路径 在IIS中新建网站(端标语8111) 直接运行http://localhost:8111/ 设备办法: 二.添加通配符脚本映 ...
随机推荐
- pycharm远程服务器进行调试
背景是这样的:我有一台远程的服务器,以及一台本地的电脑:现在我想用远程的服务器上的python编译器来运行代码,怎么办?通用的做法是ssh服务器,vim代码,之后python运行文件,但是如果遇到调试 ...
- Sublime Text 3(中文)在Windows下的配置、安装、运行
Sublime Text 3(中文)下载.安装.运行! 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 具体 ...
- HDU 2206
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU ...
- 通过阻止 touchstart 事件,解决移动端的 BUG
在 iOS10 下,即使设置了 meta 标签的 user-scalable=no 依然不能阻止用户缩放. 解决此 BUG 的方法是阻止 PC 事件: document.addEventListene ...
- 解决LNMP环境无法显示所有WordPress主题及无法编辑主题页面
解决方法: 第一.编辑/usr/local/php/etc/php.ini文件 第二.找到disable_functions这一行中,删除"scandir,"这一段脚本,然后保存这 ...
- zeebe 为微服务架构的工作流引擎
zeebe 是灵活.轻量的基于微服务架构的工作流引擎 包含以下特性: 可视化的额工作流 审计日志以及历史 水平缩放 持久化&&容错 消息驱动 操作容易 语言无关 工作流基于标准bpmn ...
- 关于C# winform怎么调用webapi来获取到json数据
C/S系统也可以和B/S系统一样实现“前后端分离”,那这样写winform就相当于纯粹的前端页面了,然后再单独部署一个webapi项目,通过api调用数据库进行数据的操作,有利于维护和数据安全性的提高 ...
- 利用反射C#获取事件列表
在程序设计中有时候需要动态订阅客户自己的事件,调用完成后又要删除以前订阅的事件.因为如果不删除,有时会造成事件是会重复订阅,导致程序运行异常.一个办法是用反射来控件事件列表.清空方法代码如下: /// ...
- 模拟实现strncpy,strncat,strncmp
1.模拟实现strncpy <1.>strncpy相比于strcpy增加了size_t参数可以实现最多拷贝的字节数<2.>(size_t不可以超出拷贝存放的内存大小)来保证不 ...
- What happens to our code? JavaScript 代码是怎样执行的
1. 我们的代码第一步会被parser 语法分析程序分析. 如果没有报错之后 2. 生产SyntaxTree, 我们的代码会转换成machine code 3. 最终 我们的代码会被运行出来. 下面的 ...