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

时间:2010-01-08 03:56:04

标签: asp.net iis-7 windows-7 url-rewriting forms-authentication

我已经使用了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。

所以我有几个问题:

  • 有没有人知道为什么Page.User总是等于null .html => .aspx改写页面?
  • 为什么它适用于VWD 2008,而不是IIS7?
  • 从IIS6改变了什么=> IIS7可能导致了这个?
  • 有关解决方法的其他想法吗?

[注意:我刚尝试过.aspx => .aspx重写并没有出现问题。不是我想要的,但我想应该提一下。]

3 个答案:

答案 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处理程序

此解决方案在下面的主题中提出。不幸的是,微软选择不完全解释这种行为背后的原因:

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

答案 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”,因为它会增加静态文件请求的不必要开销。