【问题标题】:Deploy ASP.NET MVC 2 to IIS 7.5 targeting .NET 3.5将 ASP.NET MVC 2 部署到面向 .NET 3.5 的 IIS 7.5
【发布时间】:2010-05-24 19:54:26
【问题描述】:

我在 Visual Studio 2008 中创建了一个 ASP.NET MVC 2 应用程序。我将发布版本设置为通过 ASP.NET 编译器来预编译所有视图、缩小 Javascript 和 CSS、清理 web.config 等。由于生产部署将使用 IIS6 服务器,因此我在我的 Windows 7 机器上设置了我的伪生产部署,以使应用程序池以针对 2.0 运行时的经典模式运行。我在 web.config 中设置了必要的无扩展处理程序,并且一切正常。

当我将解决方案升级到 Visual Studio 2010 时出现了问题。我仍然针对 3.5 框架,但现在我使用的是 MSBuild 4.0,因为这是 Visual Studio 2010 使用的。一切仍然可以正确编译,因为它在 Cassini 下运行良好,但是当我将它部署到相同的位置(相同的应用程序池、身份等)时,它现在的行为有所不同。我在 web.config 中仍然有无扩展处理程序,但是现在当我导航到应用程序的根目录时,它会进行目录浏览,并且以前处理过的任何路由现在都返回为 404 错误,由 IIS 中的 StaticFile 处理程序处理.我不知道发生了什么变化并导致了中断。

我查看了this question,但我已经验证了所有必备组件都已安装。

【问题讨论】:

    标签: visual-studio-2010 asp.net-mvc-2 iis-7.5


    【解决方案1】:

    您是否尝试在服务器上使用Phil Haack route debugger 调试您的路由?

    编辑:
    在 IIS 7.5 上,您不需要任何特殊的无扩展处理程序,这是自动处理的,您无需更改任何内容。据我所知,它仅在 IIS 6 上是必需的。 这可能是问题吗?如果您删除该特殊处理程序怎么办?也许这就是阻止它启动路由引擎的原因。

    编辑:
    我仔细检查了一下,我想,从 IIS7 开始,AppDomain 的默认模式是 Integrated Mode。这意味着 Asp.net 堆栈会在每次请求时启动,而在经典模式下,仅在调用特定扩展时才调用 asp.net(默认情况下将 aspx ashx axd 映射到 aspnet_isapi 过滤器)。
    UrlRoutingModule 在每次请求时都会启动,而不需要您提供任何内容,因为它是 HttpModule 而不是 Handler。 (它只需要在您的应用程序的配置文件中注册,无需将其映射到扩展,但这是默认情况下在 MVC 应用程序中。您可以打开 Web.Config 文件并验证您是否在 一个节点

    <modules runAllManagedModulesForAllRequests ="true">
    ...
    <add name="UrlRoutingModule" type=.../>
    </modules>
    

    您确定将 MVC 程序集部署到服务器吗? 检查 System.Web.MvcSystem.Web.RoutingSystem.Web.Abstraction 引用的 Copy Local 属性是否设置为 true确保您在本地和生产服务器上使用相同的程序集...

    如果所有这些都是正确的,我不知道如何为您提供更多帮助...我希望这会对您有所帮助,或者至少让您走上正确的轨道。

    编辑: 哇...刚刚阅读了您的最后一条评论...抱歉,我错过了有关经典模式的元素。您的标题提到了 IIS7.5,我假设了太多事情。这就是我感到困惑的原因。

    老实说,现在我不得不查看 Steven Sanderson 的书。他有一个用于对 IIS6 部署进行故障排除的清单。 我知道你是说只有在使用 MSBuild 4 时才会失败,但它可能仍然有用

    检查 Default.aspx 是否设置为默认内容页面。这可能是 404 的来源。

    然后有无扩展的 url,上次我部署到 IIS6 时,我使用了一个简单的通配符映射,我从来没有遇到过问题...... 如果您仍然遇到麻烦,对不起,我无能为力...不是我没有尝试 :) 祝你好运

    【讨论】:

    • 它没有命中路由引擎。那就是问题所在。尽管配置了 web.config,IIS 似乎忽略它并返回它的标准 404。启用 IIS 跟踪表明路由处理程序和模块没有被执行。
    • 响应您的编辑,当使用 MSBuild 3.5 编译它时,我需要其中的处理程序。否则 IIS 不知道通过路由引擎发送页面。
    • 嗯,我有点困惑,因为构建不应该改变任何与请求处理有关的东西。您的问题似乎甚至在它影响您的应用程序之前就已经发生了。您能否检查您的应用程序池是否在集成模式下运行?我现在必须离开,但稍后我会发布一个扩展答案。
    • 应用程序池以经典模式运行,因为最终生产服务器正在运行 IIS6(正如我在问题中所述),因此我试图使其尽可能接近。就像我说的,当使用 MSBuild 3.5 编译代码库时,它按预期工作。当使用 MSBuild 4(但仍针对 3.5 框架)编译时,它会导致问题。
    【解决方案2】:

    我今天在类似的情况下遇到了这个问题。

    我的问题是因为注册了 asp 32 位而不是 64 位,导致路由出现问题。

    在命令提示符下输入以下内容即可解决

    CD c:\windows\microsoft.net\framework64\v4.0.30319
    aspnet_regiis -i
    

    【讨论】:

    • 我首先将应用程序池更改为 v4.0,从而消除了错误,但是在运行上述命令(似乎安装 . net 4) 应用程序运行(与使用 Visual Studio 开发服务器相同)。
    【解决方案3】:

    尝试几个想法

    • 您是否进行过任何类型的比较 VS2008的输出和之间 VS2010项目?只是验证 解决方案升级没有改变 任何事物。
    • 你有 web.config targetFramework 属性设置在 compilation 元素?
    • 你确定你没有跑步吗 类似于运行 x86 应用程序 在 x64 应用程序池中?

    我猜你在这些方面没问题,但由于 Cassini 的应用程序没有问题,我仍然倾向于 web.config 问题。您是否在元素中正确注册了您的模块/处理程序?由于您运行的是经典模式,因此您将需要“旧”和“新”(reference 1reference 2)。

    【讨论】:

    • web.config 中没有 targetFramework,但我在项目文件本身中设置了 targetFrameworkVersion。由于我在这两种情况下都预编译并将其部署到 IIS,所以我不知道是否需要 web.config。至于两者之间的输出,由于我使用的是实体框架,因此很难进行二进制比较,并且必须为 VS2010 工具集对其进行一些更改。
    • 快速更新。我尝试在编译元素上设置 targetFramework 属性并尝试构建项目导致 VS2010 说在定位 4.0 框架之前没有必要。另外,我怀疑这是 x86 与 x64 的问题,因为我在 x86 硬件和操作系统上严格编译和运行。
    • web.config 中的模块/处理程序注册有什么运气吗?那个看起来最有希望并且符合“症状”
    【解决方案4】:

    我已经在另一个帖子中发布了这个解决方案,但我会重复一遍。 使用AppPool的classic流水线模式:

    别忘了在开启或关闭Windows功能中安装HTTP Redirection模块。

    【讨论】:

    • 如果您查看我对@stephanie 的回复,您会发现我已经在经典模式下运行 AppPool。如果您会查看问题中的链接,我说我已经安装了必备组件(包括 HTTP 重定向)。
    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 2011-06-19
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多