我已经使用UrlRewriting.Net模块几年了,在Windows和Windows2003中没有任何问题。我最近刚把家里的PC升级到Windows 7,并开始开发一个新的网站。
计划是使用.html扩展,并使用.aspx模块将它们重写给对应的UrlRewriting.Net。所有在VWD 2008中都能完美地工作,但当我尝试通过IIS7运行它时,情况就不同了。
当我试图通过.html重写访问一个页面时,我不能再访问Page.User;它一直返回null。如果我使用它的.aspx扩展点击页面,Page.User就会被正确填充。我还应该提到,我的母版页中有一个LoginView控制器,它也有同样的症状:通过.html扩展访问时,它显示了AnonyousTemplate;在使用.aspx扩展时,它正确地显示了LoggedInTemplate。我猜这两者是有关联的。
注意:我也尝试过无扩展URL,它们显示了同样的问题
让它工作的唯一方法是将应用程序池切换到Classic,然后需要我为.html扩展添加一个.html ddl处理程序,否则它将由StaticFileHandler处理,并出现404错误。不过,我希望我的web应用程序能够为人们正常运行,而不必摆弄IIS。
因此,我只剩下几个问题:
注意:我刚刚尝试了一个.aspx => .aspx重写,但它没有显示出问题。不完全是我想要的,但我想我应该提一下。
发布于 2010-01-08 15:53:46
UrlRewriting.Net模块刚刚有了突破。这使得它在IIS7中以集成模式工作:
<modules runAllManagedModulesForAllRequests="true">
在找到它之后,我对"runAllManagedModulesForAllRequests“进行了搜索,首先弹出的是斯科特·格思里的博客,它实际上讨论了为此目的使用它。
发布于 2010-05-15 21:23:32
另一种似乎有效的方法是删除会话模块并读取它,保留“只对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>问题似乎在于,当使用*.htm时,会话模块不执行“HttpContext.RewritePath”文件,但是以这种方式删除和读取该模块会导致对请求执行会话处理程序。
这个解决方案是在下面的线程上提出的。不幸的是,微软没有完全解释这种行为背后的原因:
http://connect.microsoft.com/VisualStudio/feedback/details/357248/context-rewritepath-disables-session-module-in-iis7
发布于 2011-12-16 19:31:40
Microsoft在Service 1 for Win7和Windows 2008 R2:http://www.microsoft.com/download/en/details.aspx?id=5842中包含了解决此问题的方法(至少对于无扩展urls)
也可作为修补程序使用:http://support.microsoft.com/kb/980368
应用此修补程序之后,ASP.NET 4应用程序可以处理对无扩展URL的请求。因此,在执行处理程序之前运行的托管HttpModules将运行。在某些情况下,HttpModules可以返回无扩展URL的错误。例如,只为期望获得HttpModule请求而编写的.aspx现在可能会在试图访问HttpContext.Session属性时返回错误。
在应用SP1或修补程序之后,不需要进行web.config更改就可以使会话和表单用于重写到asp.net页面/处理程序/等的无扩展URL。
我不知道这是否修复了对静态文件扩展名(如.htm )的重写。我猜可能不是。我会尽量避免在生产环境中设置runAllManagedModulesForAllRequests="true“,因为它会在静态文件请求上增加不必要的开销。
https://stackoverflow.com/questions/2025398
复制相似问题