IIS 7.0/Windows Server 2008上的ASP.NET MVC 3应用程序出现404.0错误

Jus*_*zer 32 iis-7 .net-4.0 windows-server-2008 asp.net-4.0 asp.net-mvc-3

我正在尝试将ASP.NET MVC 3应用程序部署到Windows 2008 x64服​​务器(显然运行IIS 7.0),并且IIS似乎不希望正确地提供内容.所有请求都导致404.0错误,因为请求与任何处理程序都不匹配,并且IIS正在尝试使用StaticFile处理程序来提供请求.这个问题似乎与.NET 4.0有关,因为我有一个MVC 2应用程序在为.NET 2.0运行时配置的应用程序池中运行得很好.

在Windows 7和Windows Server 2008 R2上将此相同的应用程序部署到IIS 7.5服务器时,我没有遇到任何问题.

在部署之前,2008服务器没有安装.NET 4.0或ASP.NET MVC 3,因此以下是我在部署应用程序之前执行的步骤:

  1. 安装了.NET 4.0
  2. 跑aspnet_regiis.exe(来自Framework64/v4.0.30319文件夹)
  3. 使用Web平台安装程序安装ASP.NET MVC 3
  4. 应用MS更新KB980368以使某些IIS 7.0或IIS 7.5处理程序能够处理其URL不以句点结尾的请求

对应用程序中的静态资源(JavaScript文件,图像等)的请求顺利通过,但对MVC操作的任何请求都会因404.0错误而失败.我注意到IIS正在使用StaticFile处理程序来处理这些请求,这显然是不正确的.据我所知,ASP.NET 4.0处理程序(即ExtensionlessUrl-ISAPI-4.0*处理程序)已正确定义,因此我不知道为什么/如何处理这些处理程序不会处理请求并且将落在所有处理程序中一直到StaticFile处理程序.

我还遇到了以下MS知识库文章,其中提到您应确保在遇到404错误的服务器上启用/安装HTTP重定向和静态内容压缩.我检查了,我的服务器已经启用了这两个功能.我甚至尝试删除并重新安装功能无济于事.

在这一点上,我完全没有想到为什么这不能正常工作.我能够在2个不同的IIS 7.0服务器上复制该问题.我错过了什么?

Mic*_*ell 36

你实际上只是提醒我,我需要在这里的环境中解决这个问题.如果您的情况与我的相同,那么这是一个简单的修复.

只需将以下内容添加到您的Web配置中:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
Run Code Online (Sandbox Code Playgroud)

编辑:提供有关手头问题的进一步说明.在我的情况下发生的事情是当我添加自定义路由映射时,IIS将请求视为文件夹/静态文件请求,因此正在跳过ASP.NET工作进程.这在开发环境下的行为通常不同,因为它在开发Web服务器下运行,该服务器也将通过.net进程传递所有请求.

此Web Config条目告诉IIS,即使IIS将其确定为静态文件或文件夹,您也应该在每个Web请求上运行模块.


Jus*_*zer 2

问题最终是我的代码完全依赖于仅在 IIS 7.5 中可用的自动启动功能。我能够在 IIS 中的失败请求跟踪功能的帮助下发现该问题,现在我修改了 global.asax.cs 文件,以便应用程序能够正确初始化,无论其加载方式/时间如何。

  • 我的 global.asax.cs 文件 (MvcApplication) 中定义的类实现了“IProcessHostPreloadClient”以利用 IIS 7.5 自动启动功能。因此,我将“Application_Start”中的所有代码移至“Preload”方法中。为了支持不使用自动启动功能的情况,我从“ApplicationStart”调用“Preload”。为了确保“Preload”仅被调用一次,我使用了一个静态布尔字段,检查该字段以确定“Preload”方法之前是否已执行。 (2认同)