404. - Открытый метод действия X не найден на контроллере Y (ActionInvoker.InvokeAction возвращает false) - PullRequest
39 голосов
/ 29 марта 2012

Это НЕ дублирующий вопрос, и проблема сводит меня с ума. Я получаю типичную ошибку «Метод публичного действия 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 } 
    );

}

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

EDIT

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

Ответы [ 2 ]

58 голосов
/ 30 марта 2012

Проблема в том, что вы указываете оба атрибута HttpGet и HttpPost. Если вы оставите их обоих, действие принимает запросы POST и GET. Я предполагаю, что атрибуты HttpGet и HttpPost не сигнализируют MVC о разрешении соответствующего типа запроса, но запрещают противоположный тип. Поэтому, включив [HttpPost], вы отказываете в GET-запросах, а включив [HttpGet], вы отказываете в POST-запросах ... фактически отказывая во всех типах запросов. Не указывайте атрибуты, и он будет принимать оба типа.

Обновление : Я только что проверил источник MVC, и мои предположения верны. В ActionMethodSelector он проверяет атрибуты следующим образом:

if (attrs.All(attr => attr.IsValidForRequest(controllerContext, methodInfo))) {
    matchesWithSelectionAttributes.Add(methodInfo);
}

Другими словами, все ActionMethodSelectorAttribute (из которых происходят HttpPostAttribute и HttpGetAttribute) должны возвращать true для действия, которое будет вызвано. Один или другой всегда будет возвращать false, поэтому действие никогда не будет выполнено.

1 голос
/ 01 мая 2014

Осторожно: в моем случае я получал ошибку 500 при попытке доступа к новому методу действия.

IIS 8.5 Подробная ошибка - 500.0 - Метод публичного действия 'getwells' не найденна контроллере «ITVizion.VizionLogs.Widgets.Controllers.MapController».

Я добавил метод действия в контроллер и «развертывал» обновленное приложение в IIS.

Проблема: Я развертывал конфигурацию Debug в Visual Studio и снял флажок с этого конкретного проекта.Это должно было ускорить сборку в Visual Studio, поскольку в решении много проектов.: D Переходя в папку приложения IIS, я увидел, что DLL проекта устарела.

Поэтому убедитесь, что вы проверили проект на Build.:) Это, очевидно, позаботится о развертывании нового codez в IIS.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...