Прерывистое исключение 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.
Надеюсь, это поможет кому-то:)