Почему я получаю 404, когда маршрут совпадает? ASP.Net MVC

Я застрял в этом вопросе в течение нескольких часов.

У меня есть контроллер под названием "DecisionPoint", и у меня есть точка останова, установленная в нем "ApplicationState". Независимо от того, что я пытаюсь, я продолжаю получать 404 в браузере. Я подозревал, что мой маршрут был неправильным, поэтому я загрузил отладчик маршрута, и он превращает наши URL-адреса, которые я пытаюсь согласовать с контроллером и действием. Итак, почему я получаю 404 и никогда не вижу попадания точки останова?

/DecisionPoint/ApplicationState/no/worky → 404

Контроллер:

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

Маршрут

 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**

Я создаю совершенно новый контроллер, и он работает. Теперь это выглядит так, как выглядит моя таблица маршрутов. Правило контроллера состояния направляется в 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);

    }
}

Итак, я в тупике.

Ответ 1

Убедитесь, что ваш класс контроллера называется DecisionPointController, а не DecisionPoint

Ответ 2

Если ваш класс AreaRegistration и Controller не находятся в одном пространстве имен, вы будете в этой ситуации - маршрут будет соответствовать (и RouteDebugger подтвердит это), но вы получите 404 на "правильном" URL-адресе.

Решение состоит в том, чтобы убедиться, что обе классы находятся в одном пространстве имен.

Ответ 4

Это может произойти из-за того, что ваш Controller находится в другом проекте, который ссылается на другую версию System.Web.Mvc!

У меня были те же симптомы - был найден правильный маршрут, но он получил 404! В HttpHandler.ProcessRequest было сделано исключение, говорящее, что контроллер обработчика не реализует IController.

Ответ 5

Недавно я столкнулся с этой проблемой. Для меня проблема заключалась в том, что у меня было два контроллера с тем же именем, если разные пространства имен (один был в области).

Ответ 6

Я не гуру маршрутов, но я всегда добавлял все параметры для аргумента по умолчанию:

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

Ответ 7

В моем случае ответ на ту же проблему заключался в необходимости "включать в проект" соответствующие контроллеры и представления вместо неправильных правил маршрутизации.

Когда мои были созданы, они по какой-то причине не включались автоматически. Эта проблема была выявлена ​​после закрытия и повторного открытия решения.

{+ 1 ненависть}, присужденная Visual Studio за ее ошибочную гипер-автоматизацию, отправив мне копать файлы Web.Config, пытаясь зацепиться за расширения, и даже пытаться (и терпеть неудачу) взломать приличный ErrorController.