我已经使用了UrlRewriting.Net模块几年,在Windows XP和Windows 2003中没有任何问题。我最近刚将家用PC升级到Windows 7并开始开发新网站。
计划是使用.html扩展,并使用UrlRewriting.Net模块将它们重写为.aspx对应物。所有在VWD 2008中都能完美运行,但是当我尝试通过IIS7运行时,这是一个不同的故事。
当我尝试通过.html重写访问页面时,我无法再访问Page.User;它一直返回null。如果我使用它的.aspx扩展名点击页面,则会正确填充Page.User。我还应该提一下,我的母版页中有一个LoginView控制器,它有相同的症状:当通过.html扩展访问时,它会显示AnonyousTemplate;使用.aspx扩展名时,它会正确显示LoggedInTemplate。我猜这两者是相关的。
[注意:我也尝试过无扩展名的网址,他们也遇到了同样的问题]
我使用它的唯一方法是将应用程序池切换到Classic,然后要求我为.html扩展名添加ASP.Net ddl处理程序[否则它由StaticFileHandler处理并出现作为404错误]。但是,我希望我的网络应用程序能够为人们正常运行,而无需使用IIS。
所以我有几个问题:
[注意:我刚尝试过.aspx => .aspx重写并没有出现问题。不是我想要的,但我想应该提一下。]
答案 0 :(得分:11)
UrlRewriting.Net模块刚刚取得突破。这使它在IIS7中的集成模式下工作:
<modules runAllManagedModulesForAllRequests="true">
在搞清楚之后,我对“runAllManagedModulesForAllRequests”进行了搜索,弹出的第一件事是Scott Guthrie's blog,它实际上是为了这个目的而使用它。
答案 1 :(得分:2)
另一种似乎有效的方法是删除会话模块并读取它,而不选中“仅针对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'文件,但以这种方式删除和读取模块会导致为请求执行Session处理程序
此解决方案在下面的主题中提出。不幸的是,微软选择不完全解释这种行为背后的原因:
答案 2 :(得分:0)
Microsoft在Win7和Windows Server 2008 R2的Service Pack 1中包含针对此问题的修复程序(至少对于无扩展名网址): http://www.microsoft.com/download/en/details.aspx?id=5842
也可用作修补程序:http://support.microsoft.com/kb/980368
应用此修补程序后,ASP.NET 4应用程序可以处理无扩展URL请求。因此,在处理程序执行之前运行的托管HttpModule将运行。在某些情况下,HttpModules可以返回无扩展URL的错误。例如,编写为仅期望.aspx请求的HttpModule现在可能在尝试访问HttpContext.Session属性时返回错误。
应用SP1或修补程序后,不需要进行任何web.config更改来进行会话,并且无法将无扩展URL重写为asp.net页面/处理程序/等。
我不知道这是否修复了重写静态文件扩展名(如.htm)的任何内容。我的猜测可能不是。我会尽量避免在生产环境中设置runAllManagedModulesForAllRequests =“true”,因为它会增加静态文件请求的不必要开销。