404 - Публичный метод действия X не был найден на контроллере Y (ActionInvoker.InvokeAction возвращает false)

Это НЕ повторяющийся вопрос, и проблема сводит меня с ума. Я получаю типичную ошибку «Метод открытого действия X не найден на контроллере Y», который возвращает 404 Not Found. Скриншот дает вам хорошее представление:

Visual Studio debugging session

На изображении показана пауза отладчика прямо перед выполнением строки, выдающей исключение( base.HandleUnknownAction(actionName)). Теперь, прежде чем вы сделаете поспешные выводы, вот некоторая информация:

  1. В какой-то момент это работало отлично.
  2. Команда HTTP ( GET) должна быть принята действием UpdateCart(см. аннотации над сигнатурой метода).
  3. Отправляемые параметры неактуальны: ошибка происходит с POST, GETи любой комбинацией параметров.
  4. Другие аналогичные действия в том же контроллере работают хорошо.
  5. Я сделал скриншот с UpdateCartс пометкой virtual, но удаление virtualничего не изменило.
  6. На скриншоте показано, что ActionInvoker.InvokeAction(this.ControllerContext, "UpdateCart")возвращает false.Не уверен, почему отражение, выполненное над моим контроллером, не может найти метод, но он ПРЯМО ТАМ!!

Маршруты установлены по умолчанию и работают, иначе я не смог бы остановить отладчик, чтобы сделать скриншот выше. Вот код из Global.asax.cs:

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

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

}

Любые идеи приветствуются.

РЕДАКТИРОВАТЬ

Ответ Этана Брауна ниже верен: HttpGetи HttpPostявляются взаимоисключающими. Решение состояло в том, чтобы заменить эти атрибуты на [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)].

39
задан Diego 11 October 2013 в 20:32
поделиться