2011-05-16 10 views
10

He estado atascado en este tema durante varias horas.¿Por qué obtengo 404 cuando la ruta coincide? ASP.Net MVC

Tengo un controlador llamado 'DecisionPoint' y tengo un punto de interrupción configurado en su acción 'ApplicationState'. No importa lo que intento, sigo obteniendo un 404 en el navegador. Sospeché que mi ruta no era correcta, así que descargué un depurador de ruta y las URL que trato de encontrar coinciden con el Controlador y la acción. Entonces, ¿por qué obtengo un 404 y nunca veo el punto de ruptura?

/DecisionPoint/ApplicationState/no/worky -> 404

controlador:

public ActionResult ApplicationState(string fileName, string stateString) 
     { 
      string filePath = GetDpFilePath(fileName); 
      HtmlDocument htmlDocument = new HtmlDocument(); 
      htmlDocument.Load(filePath); 
      HtmlNode stateScriptNode = 
       htmlDocument.DocumentNode.SelectSingleNode("/html/head/script[@id ='applicationState']"); 
      stateScriptNode.InnerHtml = "var applicationStateJSON =" + stateString; 
      htmlDocument.Save(filePath); 

      return Json("State Updated"); 

Ruta

routes.MapRoute(
     "DecisionPointState", // Route name 
     "DecisionPoint/ApplicationState/{fileName}/{stateString}", // URL with parameters 
     new {controller = "DecisionPoint", action = "ApplicationState"} // Parameter defaults 
    ); 


     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 


     }` 
**Update** 

que crear un controlador completamente nuevo y funciona. Este es ahora el aspecto de mi tabla de rutas. Las rutas controlador correclty estatales para savestate

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "StateRoute", // Route name 
      "State/SaveState/{file}/{state}", // URL with parameters 
      new { controller = "State", action = "SaveState", file = UrlParameter.Optional, state = UrlParameter.Optional } // Parameter defaults 
     ); 

     routes.MapRoute(
      "DPStateRoute", // Route name 
      "DecisionPoint/ApplicationState/{file}/{state}", // URL with parameters 
      new { controller = "DecisionPoint", action = "ApplicationState", file = UrlParameter.Optional, state = UrlParameter.Optional } // Parameter defaults 
     ); 


     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 
     // RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); 

    } 
} 

Así que estoy confundido ..

+0

huh ... No puedo ver nada específicamente incorrecto:/ –

+0

¿Puedes acceder a otras acciones en ese controlador? Lanza una acción de índice allí para ver si estás golpeando el controlador. ¿Tienes un constructor de controlador? Coloque un punto de quiebre allí para ver si está golpeando eso. – BZink

+0

Por favor, muestre el código del controlador. – Haacked

Respuesta

0

No soy ningún gurú rutas, pero siempre han añadido todos los parámetros para el argumento por defecto:

routes.MapRoute(
    "DecisionPointState", // Route name 
    "DecisionPoint/ApplicationState/{fileName}/{stateString}", // URL with parameters 
    new {controller = "DecisionPoint", 
     action = "ApplicationState" 
     fileName = UrlParameter.Optional, 
     stateString = UrlParameter.Optional 
    } // Parameter defaults 
); 
+0

Lo he intentado ... y en este caso estoy proporcionando ambos parámetros. Gracias – Nick

+0

Nick, sé que esto suena un poco loco, pero ¿qué pasa si cambias el nombre de la acción a algo más? Estoy pensando que el nombre 'ApplicationState' confunde a IIS. –

+0

Solo traté de cambiarlo a 'UpdateState' y todavía da 404 – Nick

11

Asegúrese de que su clase de controlador se llame DecisionPointController y no DecisionPoint

10

Si su clase AreaRegistration y Controller clase no están en el mismo espacio de nombres, vas a estar en esta situación - la ruta coincidirá con (y RouteDebugger lo confirmará), pero obtendrá un 404 en la url "correcta" .

La solución es asegurarse de que ambas clases estén en el mismo espacio de nombres.

+5

También asegúrese de que la clase del controlador tenga el nombre correcto. Pasé 2 horas depurando porque el nombre del archivo era correcto, pero el nombre de la clase no era – Nilzor

+0

El enlace RouteDebugger está muerto. Por favor, actualiza si puedes? – ppumkin

+0

Dios mío ... Nilzor ..... Acabo de pasar la misma cantidad de tiempo. Guau. – Barry

2

Esto puede suceder debido a que su Controller está en otro proyecto que hace referencia a una versión diferente de System.Web.Mvc!

Tuve los mismos síntomas: se encontró la ruta correcta, ¡pero obtuve un 404! En HttpHandler.ProcessRequest, se lanzó una excepción que indica que el controlador del controlador no implementa IController.

2

Recientemente me encontré con este mismo problema. Para mí, el problema era que tenía dos controladores con el mismo nombre si había diferentes espacios de nombres (uno estaba en un área).

0

En mi caso, la respuesta para el mismo problema era una cuestión de necesidad de "incluir en el proyecto" los controladores y vistas relevantes en lugar de reglas de enrutamiento incorrectas.

Cuando se crearon los míos, no se incluyeron automáticamente por algún motivo. Este problema se reveló después de que cerré y volví a abrir la solución.

{+1 odio} otorgado a Visual Studio por su hiper-automatización defectuosa enviándome a buscar a través de la Web.Configura archivos, intenta agregar extensiones, e incluso intenta (y falla) activar un ErrorController decente.

Cuestiones relacionadas