2010-01-08 30 views
5

我已经使用UrlRewriting.Net模块几年了,在Windows XP和Windows 2003中没有任何问题。我最近将我的家用电脑升级到Windows 7并开始开发一个新网站。UrlRewriting.Net模块+ IIS7等于Page.User == null?

该计划是使用.html扩展名,并使用UrlRewriting.Net模块将它们重写到它们的.aspx对应文件中。一切在VWD 2008中完美地工作,但是当我尝试通过IIS7运行时,它是一个不同的故事。

当我尝试通过.html重写访问页面时,我无法再访问Page.User;它一直返回null。如果我使用它的.aspx扩展名访问该页面,则Page.User将正确填充。我还应该提到,我的母版页中有一个LoginView控制器,它受到相同的症状:通过.html扩展访问时,它显示AnonyousTemplate;使用.aspx扩展名时,它会正确显示LoggedInTemplate。我猜这两个是相关的。

[注:我也尝试扩展名的网址,他们表现出了同样的问题]

我已经得到了它的工作的唯一办法是切换应用程序池为经典,然后要求我补充一个用于.html扩展名的ASP.Net ddl处理程序[否则它由StaticFileHandler处理并作为404错误出现]。不过,我希望我的网络应用程序能够正常运行而不必使用IIS。

所以我留下了几个问题:

  • 没有人有想法,为什么总是Page.User等于null查找.html =>的.aspx页面改写?
  • 它为什么在VWD 2008中工作,但不是IIS7?
  • 什么从IIS6 => IIS7可能导致此?
  • 有关变通办法的其他想法?

[注意:我只是尝试了一个.aspx => .aspx重写,它没有表现出问题。不是我想要的,但我想我应该提到它。]

回答

11

刚刚在UrlRewriting.Net模块中取得突破。这使得它在集成模式下工作在IIS7:

<modules runAllManagedModulesForAllRequests="true">

计算出来后,我做了“runAllManagedModulesForAllRequests”的第一件事情的搜索是弹出是Scott Guthrie's blog该如何使用它用于此目的的实际谈判。

+2

是的IIS内的集成模式是IIS6和7之间的主要区别。您可能想要查看将IIS6从IIS6移动到IIS7(http://msdn.microsoft.com/zh-cn/library /bb515251.aspx)。 正如您发现的那样,VWD 2008通过.NET运行所有功能,因此它可以在集成模式下有效运行,并且runAllManagedModulesForAllRequests设置为true。 – krohrbaugh 2010-01-08 16:12:41

+0

谢谢山姆。你在现场。它确实解决了这个问题。我会投你的答案,但没有足够的声誉:( – Heinnge 2011-01-11 18:31:34

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”文件,但拆除和readding以这种方式的模块会导致为该请求执行会话处理程序。

此解决方案是在下面的线程中建议的。不幸的是微软选择了不解释这种行为背后充分的理由:

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

+0

嗨, 我有上面提到的方法“删除,然后重新添加会话手动”。我没有与我的分页工作,但后来当我创建CMS它开始创建与Global.asax中的Session_Start事件的问题。这个事件并没有发射。 然后,我使用上面的方法“runAllManagedModulesForAllRequests”,我很高兴我可以看到我的网页至少现在回来。将不会有进一步的问题 所以我想提醒那些打算使用第一种技术的人 感谢您的文章,您真的解决了我的问题。 – 2011-01-11 18:30:54

0

微软列入了这个问题(至少对于无扩展名的URL)修复在Service Pack 1的Win7和Windows Server 2008 R2: 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”,因为它会在静态文件请求中增加不必要的开销。