路由 HTTP 错误 404.0 0x80070002

Posted

技术标签:

【中文标题】路由 HTTP 错误 404.0 0x80070002【英文标题】:Routing HTTP Error 404.0 0x80070002 【发布时间】:2011-08-06 08:00:13 【问题描述】:

我已经在我的 ASP.NET 应用程序和我的 IIS7 开发机器上创建了路由规则,一切正常。当我将解决方案部署到也具有 IIS7 的产品服务器时,我在访问 URL 时收到错误 404(找不到页面)。也许有人可以指出问题出在哪里?

实际错误

HTTP 错误 404.0 - 未找到 您正在寻找的资源是 已删除、已更改名称或已 暂时不可用。详细的 错误信息Module IIS Web Core 通知 MapRequestHandler 处理程序静态文件错误代码 0x80070002 请求的 URL http://xxx.xxx.xxx.xxx:80/pdf-button 物理路径 C:\www\pathtoproject\pdf-按钮登录 方法匿名登录用户匿名

我的实际代码

     <add key="RoutePages" value="all,-forum/"/>

             UrlRewrite.Init(ConfigurationManager.AppSettings["RoutePages"]);


    public static class UrlRewrite
    
            public static void Init(string routePages)
            

                _routePages = routePages.ToLower().Split(new[]  ',' );
                RegisterRoute(RouteTable.Routes);




            

            static void RegisterRoute(RouteCollection routes)
            

                routes.Ignore("resource.axd/*pathInfo");
                routes.Ignore("favicon.ico");
                foreach (string routePages in _routePages)
                
                    if (routePages == "all")
                        routes.MapPageRoute(routePages, "filename", "~/filename.aspx");
                    else
                        if (routePages.StartsWith("-"))
                            routes.Ignore(routePages.Replace("-", ""));
                        else
                        
                            var routePagesNoExt = routePages.Replace(".aspx", "");
                            routes.MapPageRoute(routePagesNoExt, routePagesNoExt, string.Format("~/0.aspx", routePagesNoExt));
                        
                

            

【问题讨论】:

你使用什么类型的路由? MVC ? 我使用 System.Web.Routing.RouteCollection 类(.NET 4.0) 你希望它被路由到什么 - pdf-button.aspx?我相信你已经意识到 0x80070002 = ERROR_FILE_NOT_FOUND 【参考方案1】:

刚刚发现下面的行必须添加到web.config 文件中,现在在生产服务器上也一切正常。

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" >
   <remove name="UrlRoutingModule"/>    
  </modules>
</system.webServer>

【讨论】:

runAllManagedModulesForAllRequests="true" 单独完成了这项工作,但 Robert Bethge 给出的解决方案也更好。【参考方案2】:

建议的解决方案

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" >
    <remove name="UrlRoutingModule"/>    
  </modules>
</system.webServer>

有效,但会降低性能甚至导致错误,因为现在所有已注册的 HTTP 模块都在每个请求上运行,而不仅仅是托管请求(例如 .aspx)。这意味着模块将在每个 .jpg .gif .css .html .pdf 等上运行。

更明智的解决方案是将其包含在您的 web.config 中:

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  </modules>
</system.webServer>

这要归功于 Colin Farr。在http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html查看他关于此主题的帖子。

【讨论】:

【参考方案3】:

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

糟糕的部署,一个旧的 PrecompiledApp.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>

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/*** 到 http://andrew.arace.info/#*** 的自动转换,然后由 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;
    

【讨论】:

你用 PrecompiledApp.config 信息拯救了我的一天。 :-) 非常感谢。【参考方案4】:

对我来说,问题是 System.Web.Routing 是 3.5 版的新服务器,而 web.config 请求的是 4.0.0.0 版。 决议是

%WINDIR%\Framework\v4.0.30319\aspnet_regiis -i

%WINDIR%\Framework64\v4.0.30319\aspnet_regiis -i

【讨论】:

【参考方案5】:

在 Global.asax.cs 中解决了这个问题。

protected void Application_Start()

    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);

【讨论】:

【参考方案6】:

在 Windows 资源管理器中取消选中此项。

“隐藏已知类型的文件类型扩展名”

【讨论】:

以上是关于路由 HTTP 错误 404.0 0x80070002的主要内容,如果未能解决你的问题,请参考以下文章

MapRequestHandler - 在 IIS 8.0 中从 .aspx 路由 .html 时出现 404.0 错误

HTTP 错误 404.0 - 访问 SVC 服务时未找到

简单 MVC RoutePrefix - HTTP 错误 404.0 - 未找到

ASP.NET MVC 5 - (HTTP 错误 404.0 - 未找到)具有长的不存在的 URL

WebApi 部署IIS 404.0 not found

在网上下载了一个ASP源代码;结果浏览时;“配置错误 由于权限不足而无法读取配置文件” 错误代码0x800700