首页 文章

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

提问于
浏览
32

我正在尝试将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,因此以下是我在部署应用程序之前执行的步骤:

  • 已安装.NET 4.0

  • Ran aspnet_regiis.exe(来自Framework64 / v4.0.30319文件夹)

  • 使用Web平台安装程序安装ASP.NET MVC 3

  • 应用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 knowledge base article,其中提到您应确保在遇到404错误的服务器上启用/安装HTTP重定向和静态内容压缩 . 我检查了,我的服务器已经启用了这两个功能 . 我甚至尝试删除并重新安装功能无济于事 .

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

6 回答

  • 2

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

  • 36

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

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

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    

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

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

  • 2
  • 3

    尝试一切后我的解决方案:

    糟糕的部署,旧的 PrecompiledApp.config 挂在我的部署位置,并使一切都无法正常工作 .

    我的最终设置有效:

    • IIS 7.5,Win2k8r2 x64,

    • 集成模式应用程序池

    • web.config中没有任何变化 - 这意味着没有用于路由的特殊处理程序 . 这里's my snapshot of the sections a lot of other posts reference. I'm使用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>
    
    • Global.ashx :(只有任何注释的方法)
    void Application_Start(object sender, EventArgs e) {
        // Register routes...
        System.Web.Routing.Route echoRoute = new System.Web.Routing.Route(
              "{*message}",
            //the default value for the message
              new System.Web.Routing.RouteValueDictionary() { { "message", "" } },
            //any regular expression restrictions (i.e. @"[^\d].{4,}" means "does not start with number, at least 4 chars
              new System.Web.Routing.RouteValueDictionary() { { "message", @"[^\d].{4,}" } },
              new TestRoute.Handlers.PassthroughRouteHandler()
           );
    
        System.Web.Routing.RouteTable.Routes.Add(echoRoute);
    }
    
    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;
        }
    }
    
  • 0

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

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

    此致,Kiran Banda

  • 0

    我有同样的问题 . 我最终成为应用程序启动时失败的程序集 . 我启用了Fusion Log Viewer,以查看哪些程序集出现故障并将其计算出来 . 我从来没有发现这个,因为它看起来像是一个MVC路由问题,但我想我会发布这个问题,其他任何人都浪费了几个小时来处理这个问题!

相关问题