Прерывистое исключение asp.net mvc: "Открытый метод действия ABC не найден на контроллере XYZ".

Я получаю прерывистое исключение, говорящее, что asp.net mvc не может найти метод действия. Исключение составляет:

Открытый метод действия "Заполнить" не найти на контроллере 'Schoon.Form.Web.Controllers.ChrisController'.

Я думаю, что я правильно настроил маршрутизацию, потому что это приложение работает большую часть времени. Вот метод действий контроллеров.

[ActionName("Fill")]
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
{
     //…
}

Маршрут:

routes.MapRoute(
        "SchoonForm",
        "Form/Fill/{subscriberId}",
        new { controller = "ChrisController", action = "Fill" },
        new { subscriberId = @"\d+" }
    );

И вот стек:

System.Web.HttpException: публикация метод действия "Заполнить" не может быть найдено на контроллере 'Schoon.Form.Web.Controllers.ChrisController. в System.Web.Mvc.Controller.HandleUnknownAction(String actionName) в C:\DEV\ThirdParty\MvcDev\SRC\SystemWebMvc\Mvc\Controller.cs: линия 197 на System.Web.Mvc.Controller.ExecuteCore() в C:\DEV\ThirdParty\MvcDev\SRC\SystemWebMvc\Mvc\Controller.cs: линия 164 на System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) в C:\DEV\ThirdParty\MvcDev\SRC\SystemWebMvc\Mvc\ControllerBase.cs: линия 76 на System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) в C:\DEV\ThirdParty\MvcDev\SRC\SystemWebMvc\Mvc\ControllerBase.cs: линия 87 в System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) в C:\DEV\ThirdParty\MvcDev\SRC\SystemWebMvc\Mvc\MvcHandler.cs: линия 80 на System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) в C:\DEV\ThirdParty\MvcDev\SRC\SystemWebMvc\Mvc\MvcHandler.cs: линия 68 на System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) в C:\DEV\ThirdParty\MvcDev\SRC\SystemWebMvc\Mvc\MvcHandler.cs: линия 104 на System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() в System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean & completedSynchronously)

Вот пример моих фильтров, все они работают одинаково:

public class UserIdFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        const string Key = "userId";

        if (filterContext.ActionParameters.ContainsKey(Key))
        {
            filterContext.ActionParameters[Key] = // get the user id from session or cookie
        }

        base.OnActionExecuting(filterContext);
    }
}

Спасибо, Крис

Ответ 1

Мы нашли ответ. Мы просмотрели наши веб-журналы. Это показало, что мы получали некоторые странные действия (глаголы/методы) http, такие как OPTIONS, PROPFIND и HEAD.

Это, по-видимому, причина некоторых из этих исключений. Это объясняет, почему это прерывисто.

Мы воспроизвели проблему с помощью инструмента curl.exe:

curl.exe -X OPTIONS http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273
curl.exe -X PROPFIND http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273
curl.exe -X HEAD http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273

Исправление, которое мы использовали, это добавить раздел авторизации в web.config:

<authorization>
  <deny users="*" verbs="OPTIONS, PROPFIND, HEAD"/>
</authorization>

Ответ 2

У нас была аналогичная проблема, но выяснилось, что это происходит из-за того, что пользователь отправил на контроллер после того, как его логин был исчерпан. Затем система перенаправляется на экран входа в систему. После входа в систему он перенаправляется обратно на URL-адрес, который пользователь пытается отправить, но на этот раз он делал запрос GET и поэтому не обнаружил действие, которое было отмечено атрибутом [HttpPost].

Ответ 3

У меня такая же проблема в asp.net mvc. эта ошибка - 404 не найдена. Я разрешаю проблему таким образом - поставьте этот код в MyAppControllerBase (MVC)

    protected override void HandleUnknownAction(string actionName)
    {
        this.InvokeHttp404(HttpContext);
    }

    public ActionResult InvokeHttp404(HttpContextBase httpContext)
    {
        IController errorController = ObjectFactory.GetInstance<PagesController>();
        var errorRoute = new RouteData();
        errorRoute.Values.Add("controller", "Pages");
        errorRoute.Values.Add("action", "Http404");
        errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
        errorController.Execute(new RequestContext(
             httpContext, errorRoute));

        return new EmptyResult();
    }

Ответ 4

У нас была одна и та же проблема в нашем приложении, и я смог проследить ее до проблемы javascript/jquery. У нас есть ссылки в нашем приложении, определенные с помощью Html.ActionLink(), которые позже переопределяются в POSTs по jquery.

Сначала мы определили ссылку:

Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id})

Позже мы переопределим действие по умолчанию с помощью нашей функции SomePostEventHandler:

 $(document).ready(function() {
      $('#MyLink').click(SomePostEventHandler);
 }

Это повлияло на наше действие MVC с фильтром HttpPost:

 [HttpPost]
 public ActionResult SomeAction(int id)
 {
      //Stuff
 }

Мы обнаружили, что большую часть времени это отлично работало. Однако при некоторых медленных загрузках страниц (или действительно быстрых пользователей) пользователь щелкал ссылку до того, как было запущено событие jquery $(document).ready(), что означает, что они пытались GET/Controller/SomeAction/XX вместо размещение.

Мы не хотим, чтобы пользователь получал этот URL-адрес, поэтому удаление фильтра для нас не является опцией. Вместо этого мы просто связали событие onclick ссылки действия напрямую (нам пришлось немного изменить SomePostEventHandler(), чтобы это работало):

string clickEvent = "return SomePostEventHandler(this);";

Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id}, new { onclick = clickEvent })

Итак, мораль этой истории, по крайней мере для нас, заключается в том, что если вы видите эти ошибки, отследите URL-адрес, по которому вы ДУМАЕТЕ, что ВЫ ПОСТАЛИ, и убедитесь, что вы.

Ответ 5

У меня тоже была эта проблема.

В моем случае это было связано с ограничениями глагола на запрошенное действие, где представление было POST, но частичное представление запрашивалось только в поддерживаемых GET и HEAD. Добавление глагола POST в AcceptVerbsAttribute (в MVC 1.0) разрешило проблему.

Ответ 6

У меня есть аналогичная проблема с qq Загрузка файла

Когда действие post /Document/Save, я получаю исключение. Открытый метод действия "Сохранить" не найден на контроллере "Project.Controllers.DocumentController".

Но если пост-действие /Document/Save/, сообщение корректно и работает!

Бог сохранит /?

Ответ 7

Из журналов IIS наша проблема была вызвана попыткой Googlebot POST и GET для действия только контроллера POST.

В этом случае я рекомендую обработать 404, как предложение Дмитрия.

Ответ 8

Не должно быть

routes.MapRoute(
        "SchoonForm",
        "Form/Fill/{subscriberId}",
        new { controller = "Chris", action = "Fill" },

Кроме того, что делают ваши фильтры? Не могут ли они скрыть действие, например ActionMethodSelectorAttribute?

Ответ 9

Моя первопричина была похожа на ту, что упоминается в комментарии.

Я нажал кнопку ajaxSubmitting. Одно из полей формы было типа Date. Однако из-за различий в форматах дат между клиентским и серверным машинами он не выполнял метод POST в контроллере. Сервер отправил ответ 302, а затем снова отправил запрос GET для того же метода.

Однако действие в контроллере было украшено атрибутом HttpPost, и, следовательно, он не смог найти метод и отправил ответ 404.

Я просто исправил код таким образом, чтобы несоответствие в форматах Date не вызывало ошибки, и проблема была исправлена.

Ответ 10

Удалите атрибуты [HttpGet], и он будет работать:)

Ответ 11

Текущий принятый ответ работает как ожидалось, но не является основным вариантом использования этой функции. Вместо этого используйте функцию, определенную ASP.NET. В моем случае я отрицал все, кроме GET и POST:

  <system.webServer>
  <security>
      <requestFiltering>
          <verbs allowUnlisted="false">
              <add verb="GET" allowed="true"/>
              <add verb="POST" allowed="true"/>
          </verbs>
      </requestFiltering>
  </security>
 </system.webServer>

С приведенным выше фрагментом кода MVC правильно вернет 404

Ответ 12

Для тех, у кого есть эта проблема с параметрами angularjs, MVC и {{imagepath}}, вставляются в атрибуты src изображения, например:

"Открытый метод действия {{imagepath}} previous.png не найден на контроллере

Решение заключается в использовании ng-src вместо src.

Надеюсь, это поможет кому-то:)