路由HTTP错误404.0 0x80070002

时间:2011-04-15 12:58:33

标签: asp.net iis-7 routing url-routing

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

实际错误

  

HTTP错误404.0 - 未找到   你正在寻找的资源   删除,更改名称,或者是   暂时不可用。详细   错误信息模块IIS Web核心   通知MapRequestHandler   处理程序StaticFile错误代码   0x80070002请求的URL   http://xxx.xxx.xxx.xxx:80/pdf-button   物理路径   C:\ www \ pathtoproject \ pdf-button登录   方法匿名登录用户匿名

我的实际代码

     <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));
                        }
                }

            }
}

6 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:11)

解决方案建议

<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点击他关于此主题的帖子。

答案 2 :(得分:2)

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

部署不当,旧的 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/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;
        }
    }
    

答案 3 :(得分:1)

对我来说问题是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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

在Global.asax.cs中有这个解决了它。

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}