Iis 7 在IIS 7.0/Windows Server 2008上获取ASP.NET MVC 3应用程序的404.0错误

Iis 7 在IIS 7.0/Windows Server 2008上获取ASP.NET MVC 3应用程序的404.0错误,iis-7,.net-4.0,asp.net-mvc-3,windows-server-2008,asp.net-4.0,Iis 7,.net 4.0,Asp.net Mvc 3,Windows Server 2008,Asp.net 4.0,我正在尝试将ASP.NET MVC 3应用程序部署到Windows 2008 x64服务器(显然运行IIS 7.0),而IIS似乎不希望正确提供内容。所有请求都会导致404.0错误,因为请求与任何处理程序都不匹配,并且IIS正在尝试使用StaticFile处理程序来提供请求。这个问题似乎与.NET4.0有关,因为我有一个MVC2应用程序在为.NET2.0运行时配置的应用程序池中正常运行 在Windows 7和Windows Server 2008 R2上,将同一应用程序部署到IIS 7.5服务器

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

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

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

  • 已安装.NET 4.0
  • 运行aspnet_regiis.exe(来自Framework64/v4.0.30319文件夹)
  • 使用web平台安装程序安装ASP.NET MVC 3
  • 应用MS update以启用某些IIS 7.0或IIS 7.5处理程序来处理URL不以句点结尾的请求
  • 对应用程序中静态资源(JavaScript文件、图像等)的请求顺利通过,但对MVC操作的任何请求都会失败,并出现404.0错误。我注意到IIS使用StaticFile处理程序来处理这些请求,这显然是不正确的。据我所知,ASP.NET 4.0处理程序(即ExtensionlessUrl-ISAPI-4.0*处理程序)是正确定义的,因此我不知道为什么/如何不由这些处理程序中的一个处理该请求,并将一直下降到StaticFile处理程序

    我还遇到了以下问题,其中提到您应该确保在遇到404错误的服务器上启用/安装HTTP重定向和静态内容压缩。我检查了,我的服务器已经启用了这两个功能。我甚至尝试删除并重新安装这些功能,但都没有效果


    在这一点上,我完全不明白为什么这不能正常工作。我已经能够在两个不同的IIS 7.0服务器上复制该问题。我遗漏了什么?

    你实际上只是提醒我需要在这里的环境中解决这个问题。如果你的情况和我的一样,那么这是一个简单的解决办法

    只需将以下内容添加到web配置中:

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    
    
    
    编辑:进一步解释手头的问题。在我的例子中,当我添加自定义路由映射时,IIS将请求视为文件夹/静态文件请求,因此跳过ASP.NET工作进程。这在开发环境下的行为通常有所不同,因为它是在开发web服务器下运行的,开发web服务器也将通过.net进程传递所有请求


    此Web配置条目告诉IIS,即使IIS确定它是静态文件或文件夹,也应该在每个Web请求上运行模块

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

    请确保您在IIS 7.0集成模式下运行。如果需要在IIS 7.0经典模式下运行,则需要执行多个操作以使路由正常工作。请参考以下博客帖子


    如果您在IIS 7.5或更高版本上运行web应用程序,请确保已正确启用IIS的角色服务。感兴趣的角色服务有:ASP.NET、基本身份验证、HTTP重定向、ISAPI筛选器等

    您可以通过添加或删除程序-打开或关闭Windows功能转到角色服务。 希望这有帮助

    问候,,
    Kiran Banda

    我的解决方案,在尝试了一切之后:

    糟糕的部署,一个旧的预编译app.config挂在我的部署位置上,使一切都无法工作

    我的最终设置有效:

    • IIS 7.5,Win2k8r2 x64
    • 集成模式应用程序池
    • web.config中没有任何更改-这意味着没有用于路由的特殊处理程序。这是我的快照,有很多其他文章参考。我正在使用FluorineFX,因此我添加了该处理程序,但我不需要任何其他处理程序:

      <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <authentication mode="None"/>
      
        <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
        <httpRuntime requestPathInvalidCharacters=""/>
      
        <httpModules>
          <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx"/>
        </httpModules>
      </system.web>
        <system.webServer>
          <!-- Modules for IIS 7.0 Integrated mode -->
          <modules>
            <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx" />
          </modules>
      
          <!-- Disable detection of IIS 6.0 / Classic mode ASP.NET configuration -->
          <validation validateIntegratedModeConfiguration="false" />
        </system.webServer>
      
    • PassthroughRouteHandler.cs-这实现了从到的自动转换,然后将由default.aspx处理:

      public class PassthroughRouteHandler : IRouteHandler {
      
          public IHttpHandler GetHttpHandler(RequestContext requestContext) {
              HttpContext.Current.Items["IncomingMessage"] = requestContext.RouteData.Values["message"];
              requestContext.HttpContext.Response.Redirect("#" + HttpContext.Current.Items["IncomingMessage"], true);
              return null;
          }
      }
      

      • 我也有同样的问题。我的程序集在应用程序启动时失败。我启用了Fusion日志查看器来查看哪些程序集出现故障,并找到了解决方法。我从来没有发现过这一点,因为这似乎是一个MVC路由问题,但我想我会发布这篇文章,以防其他人也在这个问题上浪费时间

        首先:看一看事件查看器,您可以节省时间找到合适的解决方案。@Dario:在任何Windows日志中都没有与此问题相关的值得注意的内容。工作进程没有抛出任何异常,并且在4.0运行时之上正常运行。ASP.NET也没有抛出任何异常,因为IIS从未调用过它,因为IIS正在尝试使用StaticFile处理程序来处理请求。作为记录,我所需要的只是应用修补程序(bullet#4)。您是如何在global.asax中初始化它的?在我的global.asax.cs文件(MVCAPApplication)中定义的类实现
        IProcessHostPreloadClient
        以利用IIS 7.5自动启动功能。因此,我将
        Application\u Start
        中的所有代码移动到
        Preload
        方法。以支持自动启动的情况
        public class PassthroughRouteHandler : IRouteHandler {
        
            public IHttpHandler GetHttpHandler(RequestContext requestContext) {
                HttpContext.Current.Items["IncomingMessage"] = requestContext.RouteData.Values["message"];
                requestContext.HttpContext.Response.Redirect("#" + HttpContext.Current.Items["IncomingMessage"], true);
                return null;
            }
        }