32

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

我有没有问题,在Windows 7和Windows Server 2008 R2部署此相同的应用到IIS 7.5服务器两者。

在部署之前,2008年的服务器没有.NET 4.0或安装ASP.NET MVC 3,所以这里有我承担部署应用之前的步骤:

  1. 安装了.NET 4.0
  2. 使用web平台安装
  3. 应用MS更新KB980368启用某些IIS 7.0或IIS 7.5处理程序来处理其URL的请求然ASPNET_REGIIS.EXE(从Framework64/v4.0.30319文件夹)
  4. 安装ASP.NET MVC 3不要以ap结尾eriod

对应用程序中的静态资源(JavaScript文件,图像等)的请求经历的顺利,但任何对MVC操作的请求都会失败,并出现404.0错误。我注意到IIS正在使用StaticFile处理程序来处理这些请求,这显然是不正确的。据我所知,ASP.NET 4.0处理程序(即ExtensionlessUrl-ISAPI-4.0 *处理程序)已被正确定义,所以我不知道为什么/如何处理请求不会由其中一个处理程序处理,向下到StaticFile处理程序。

我还遇到以下MS knowledge base article其中提到您应该确保HTTP重定向和静态内容压缩在您遇到404错误的服务器上启用/安装。我查了一下,并且这两个功能都已经为我的服务器启用了。我甚至尝试删除并重新安装功能无济于事。

在这一点上我完全没了主意的原因,这是不正常。我已经能够在2个不同的IIS 7.0服务器上复制该问题。我错过了什么?

+0

首先:看看事件查看器,可以节省您的时间来找到妥善的解决办法。 – Dariusz 2011-02-25 13:07:02

+0

@Dario:有关此问题的任何Windows日志中都没有提及。工作进程不会抛出任何异常,并且在4.0运行时之上正常运行。 ASP。NET也没有抛出任何异常,因为它永远不会被IIS调用,因为IIS试图使用StaticFile处理程序来处理请求。 – 2011-02-25 15:15:18

+1

为了记录,我需要的是应用修补程序(子弹#4)。 – xanadont 2011-12-06 21:54:15

回答

2

问题结束了,我的代码完全依靠自动启动功能,只有在IIS 7.5是可用的。我能够与失败请求在IIS跟踪功能的帮助下,发现这个问题,现在我已经修改了我的Global.asax.cs文件,以便在应用程序将被正确初始化,不管如何/时加载它。

+0

你是如何在global.asax中初始化它的? – jdiaz 2011-03-01 23:06:36

+2

在我的global.asax.cs文件(MvcApplication)中定义的类实现'IProcessHostPreloadClient'以利用IIS 7.5自动启动功能。因此,我将'Application_Start'中的所有代码移至'Preload'方法。为了支持不使用自动启动功能的情况,我从'ApplicationStart'调用'Preload'。为了确保'Preload'只被调用一次,我使用了一个静态布尔字段,该字段被检查以确定是否执行了'Preload'方法。 – 2011-03-02 19:09:47

35

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

只需添加以下到您的web配置:

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

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

此Web配置入门告诉IIS,你有,应该在即使IIS决定了它是一个静态文件或文件夹的每个Web请求运行模块。

+0

非常感谢,我有同样的问题,现在它的工作 – 2011-07-20 12:16:10

+1

另外,如果你的web服务与aspx文件在同一个web容器中,你会遇到一个障碍,因为本地模块不会运行,而静态文件(如图像)将无法正常服务。把Web服务放在其他地方可能会(缓慢地减轻)。 – 2011-10-03 21:16:03

+0

从win7上的开发环境到win2k8现场服务器有同样的问题。项目将webforms与mvc3混合。解决了我的问题。 – Jeroen 2012-01-05 10:07:00

3

请确保您在IIS 7.0集成模式下运行。如果您需要在IIS 7.0 Classic模式下运行它,则需要执行多个操作才能使路由起作用。请参阅以下博客文章;

http://www.tugberkugurlu.com/archive/running-asp-net-mvc-under-iis-6-0-and-iis-7-0-classic-mode---solution-to-routing-problem

http://www.tugberkugurlu.com/archive/deployment-of-asp-net-mvc-3-rc-2-application-on-a-shared-hosting-environment-without-begging-the-hosting-company

+0

我应该在原帖中提到该应用程序池正在使用集成管道。我忽略提到这一点,但事实确实如此。请参阅我的答案,了解我的问题的实际原因和解决方案。 – 2011-03-07 17:47:30

+0

这是我的问题,谢谢你张贴答案! – TheZenker 2012-06-15 14:33:02

0

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

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

问候, 基兰邦达

2

我的解决办法,乱投医后:

坏部署,旧PrecompiledApp.config被挂在我的部署位置,使一切不工作。

我认为工作最终设置:

  • IIS 7.5,Win2k8r2 64,在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> 
    
  • 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); 
    } 
    
  • PassthroughRouteHandler的.cs - 这实现从http://andrew.arace.info/stackoverflowhttp://andrew.arace.info/#stackoverflow自动转换这将随后由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; 
        } 
    } 
    
+0

TestRoute定义在哪里,当我尝试这个时,它不会编译,因为它缺失。 – 2014-12-15 16:21:16

+0

@ EricBrown-Cal TestRoute.Handlers是我的“PassthroughRouteHandler”所在的名称空间的名称。您可能很容易成为一个不同的名称空间。我建议只是放入“PassthroughRouteHandler”,让intellisense帮助你使用正确的“使用...”语句 – 2015-01-20 14:48:18

0

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

相关问题