UrlRewriting.Net模块+IIS7等于Page.User == null?

5
我已经使用UrlRewriting.Net模块几年了,在Windows XP和Windows 2003上没有任何问题。我最近升级了家里的电脑到Windows 7并开始开发一个新网站。
计划是使用.html扩展名,并使用UrlRewriting.Net模块将它们重写为它们的.aspx对应项。在VWD 2008中一切都运行得很完美,但当我尝试通过IIS7运行它时情况就不同了。
当我尝试通过.html重写访问页面时,我无法再访问Page.User;它一直返回null。如果我使用它的.aspx扩展名访问该页面,则Page.User会被正确填充。我还应该提到,我的Master Page中有一个LoginView控制器,它也遇到了相同的症状:当通过.html扩展名访问时,它显示AnonyousTemplate;当使用.aspx扩展名时,它正确地显示LoggedInTemplate。我猜两者之间有关联。
[注意:我也尝试过无扩展名的URL,它们表现出同样的问题]
我唯一使它工作的方法是将应用程序池切换为Classic,这就需要我为.html扩展名添加一个ASP.Net ddl处理程序[否则它将由StaticFileHandler处理,并显示为404错误]。然而,我希望我的Web应用程序能够在不必摆弄IIS的情况下正常运行。
所以我还有几个问题:
- 为什么Page.User始终等于null,而.html => .aspx重写页面? - 为什么它在VWD 2008中工作,但不在IIS7中工作? - 从IIS6 => IIS7有什么改变可能导致这种情况? - 其他解决方法的想法?
[注意:我刚刚尝试了一个.aspx => .aspx重写,它没有表现出这个问题。不是我想要的,但我想我应该提一下。]
3个回答

11

刚刚通过UrlRewriting.Net模块取得了突破。这使它能在IIS7的集成模式下工作:

<modules runAllManagedModulesForAllRequests="true">

在弄清楚之后,我搜索了"runAllManagedModulesForAllRequests",第一件出现的事情是Scott Guthrie的博客,他实际上谈到了将其用于此目的。


2
是的,IIS中的集成模式是IIS6和7之间的主要区别。您可能需要查看将ASP.NET应用程序从IIS6移动到IIS7(http://msdn.microsoft.com/en-us/library/bb515251.aspx)。正如您发现的那样,VWD 2008通过.NET运行所有内容,因此它实际上是在启用runAllManagedModulesForAllRequests的集成模式下运行的。 - krohrbaugh
谢谢Sam。你说得对。它确实解决了问题。我想投票支持你的答案,但是我的声望不够:( - Heinnge

2
另一种看起来有效的方法是删除 Session 模块,然后重新添加它,但不选中“仅针对 ASP.NET 应用程序或托管处理程序的请求调用”复选框。在 web.config 文件中应该像这样:

<system.webServer>
  <modules>
    <remove name="Session" />
    <add name="SessionManualAdd" type="System.Web.SessionState.SessionStateModule, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </modules>
</system.webServer>

“问题似乎是当使用HttpContext.RewritePath时,Session模块不会执行 '*.htm' 文件的操作,但是以这种方式移除和重新添加模块会导致会话处理程序执行请求。”
“下面的线程建议采用此解决方案。不幸的是,微软选择没有完全解释这种行为背后的原因:”

http://connect.microsoft.com/VisualStudio/feedback/details/357248/context-rewritepath-disables-session-module-in-iis7


嗨,我之前使用了上面提到的“手动删除并重新添加会话”的方法。它确实可以在我的分页中工作,但后来当我创建CMS时,它开始在Global.asax中的Session_Start事件中出现问题。这个事件根本没有触发。然后我使用了上面提到的“runAllManagedModulesForAllRequests”方法,我很高兴至少现在可以看到我的页面。希望不会有进一步的问题。所以我想警告那些计划使用第一种技术的人。感谢您的帖子,您真正解决了我的问题。 - user384721

0

微软在Win7和Windows Server 2008 R2的Service Pack 1中(至少对于无扩展名的URL)包含了解决此问题的修复程序: http://www.microsoft.com/download/en/details.aspx?id=5842

也可作为热补丁使用:http://support.microsoft.com/kb/980368

应用此补丁后,ASP.NET 4应用程序可以处理无扩展名的URL请求。因此,在处理程序执行之前运行的托管HttpModules将会运行。在某些情况下,HttpModules可能会针对无扩展名的URL返回错误。例如,一个仅期望.aspx请求的HttpModule现在尝试访问HttpContext.Session属性时可能会返回错误。

应用SP1或热补丁后,不需要进行任何web.config更改即可使会话和表单验证适用于重写为asp.net页面/处理程序等的无扩展名URL。

我不确定这是否适用于像.htm这样的静态文件扩展名的重写。我的猜测是,可能不行。在生产环境中,我会尽量避免设置runAllManagedModulesForAllRequests="true",因为它会增加静态文件请求的不必要开销。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接