【问题标题】:UrlRewriting.Net Module + IIS7 Equals Page.User == null?UrlRewriting.Net 模块 + IIS7 等于 Page.User == null?
【发布时间】:2011-01-02 18:45:38
【问题描述】:

我已经使用 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。我猜这两者是相关的。

[注意:我也尝试过无扩展名的 URL,但它们也出现了同样的问题]

我让它工作的唯一方法是将应用程序池切换到 Classic,然后需要我为 .html 扩展名添加一个 ASP.Net ddl 处理程序 [否则它由 StaticFileHandler 处理并出现作为 404 错误]。但是,我希望我的 Web 应用程序能够正常运行,而不必摆弄 IIS。

所以我有几个问题:

  • 有人知道为什么 Page.User 对于 .html => .aspx 重写的页面总是等于 null 吗?
  • 为什么它在 VWD 2008 中有效,但在 IIS7 中无效?
  • 从 IIS6 => IIS7 发生的哪些变化可能导致了这种情况?
  • 对解决方法还有其他想法吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    <modules runAllManagedModulesForAllRequests="true">

    在弄清楚之后,我在“runAllManagedModulesForAllRequests”上进行了搜索,弹出的第一件事是Scott Guthrie's blog,它实际上谈到了将其用于此目的。

    【讨论】:

    • 是的,IIS 中的集成模式是 IIS6 和 7 之间的主要区别。您可能需要查看将 ASP.NET 应用程序从 IIS6 迁移到 IIS7 (msdn.microsoft.com/en-us/library/bb515251.aspx)。正如您所发现的,VWD 2008 通过 .NET 运行所有内容,因此它可以在 runAllManagedModulesForAllRequests 设置为 true 的集成模式下有效运行。
    • 谢谢山姆。你很准。它确实解决了问题。我会投票给你的答案,但没有足够的声誉:(
    【解决方案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”文件执行,但是以这种方式删除和读取模块会导致为请求执行 Session 处理程序.

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

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

    【讨论】:

    • 嗨,我有上面提到的“手动删除然后重新添加会话”的方法。我确实使用了分页,但后来当我创建 CMS 时,它开始在 Global.asax 中创建 Session_Start 事件的问题。这个事件根本没有触发。然后我使用上面的方法“runAllManagedModulesForAllRequests”,我很高兴我至少现在可以看到我的页面。希望不会再有问题。所以我想警告那些打算使用第一种技术的人。谢谢你的帖子,你真的解决了我的问题。
    【解决方案3】:

    Microsoft 在 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 pages/handlers/etc 的无扩展 URL。

    我不知道这是否解决了重写静态文件扩展名(如 .htm)的问题。我的猜测是,可能不会。我会尽量避免在生产环境中设置 runAllManagedModulesForAllRequests="true",因为它会增加静态文件请求的不必要开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      相关资源
      最近更新 更多