Je reçois une exception intermittente indiquant que asp.net mvc ne peut pas trouver la méthode d'action. Voici l'exception:
Une méthode d'action publique «Fill» est introuvable sur le contrôleur «Schoon.Form.Web.Controllers.ChrisController».
Je pense que le routage est correctement configuré car cette application fonctionne la plupart du temps. Voici la méthode d'action du contrôleur.
[ActionName("Fill")]
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
{
//…
}
La route:
routes.MapRoute(
"SchoonForm",
"Form/Fill/{subscriberId}",
new { controller = "ChrisController", action = "Fill" },
new { subscriberId = @"\d+" }
);
Et voici la pile:
System.Web.HttpException: Une méthode d'action publique 'Fill' n'a pas pu être trouvée sur le contrôleur 'Schoon.Form.Web.Controllers.ChrisController'. à System.Web.Mvc.Controller.HandleUnknownAction (String actionName) dans C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: ligne 197 à System.Web.Mvc.Controller.ExecuteCore () dans C : \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: ligne 164 à System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) dans C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs: ligne 76 à System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) dans C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs: ligne 87 à System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext) dans C:
Voici un exemple de mes filtres, ils fonctionnent tous de la même manière:
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);
}
}
Merci Chris
la source
PostSomething { return HomePageActionMethod() }
échoue là oùPostSomething { return RedirectToAction(nameof(HomePageActionMethod)); }
fonctionne. (dans notre cas, l'action incriminée dans la vue est située dans un contrôleur différent, et vraisemblablement ce contrôleur n'est pas complètement initialisé avec la première méthode d'appel.Réponses:
Nous avons trouvé la réponse. Nous avons examiné nos journaux Web. Cela a montré que nous recevions des actions http étranges (verbes / méthodes) comme OPTIONS, PROPFIND et HEAD.
Cela semble être la cause de certaines de ces exceptions. Cela explique pourquoi il était intermittent.
Nous avons reproduit le problème avec l'outil curl.exe:
Le correctif que nous avons utilisé était d'ajouter une section d'autorisation à web.config:
la source
Nous avons eu un problème similaire, mais nous avons constaté que cela se produisait parce qu'un utilisateur publiait sur un contrôleur après l'expiration de sa connexion. Le système est ensuite redirigé vers l'écran de connexion. Après s'être connecté, il a redirigé vers l'URL sur laquelle l'utilisateur essayait de publier, mais cette fois, il faisait une requête GET à la place et ne trouvait donc pas l'action qui était marquée d'un attribut [HttpPost].
la source
J'ai eu le même problème dans asp.net mvc. cette erreur - 404 introuvable. Je résous le problème de cette façon - mettez ce code dans
MyAppControllerBase
(MVC)la source
Nous venons d'avoir le même problème sur notre application et j'ai pu le retracer jusqu'à un problème javascript / jquery. Nous avons des liens dans notre application définis à l'aide de Html.ActionLink () qui sont ensuite remplacés dans les POST par jquery.
Nous avions d'abord défini le lien:
Plus tard, nous remplaçons l'action par défaut avec notre fonction SomePostEventHandler:
Cela frappait notre action MVC qui avait un filtre HttpPost:
Ce que nous avons constaté, c'est que la plupart du temps, cela fonctionnait très bien. Cependant, sur certains chargements de page lents (ou utilisateurs très rapides), l'utilisateur cliquait sur le lien avant que l'événement jquery $ (document) .ready () ne se déclenche, ce qui signifie qu'il essayait de GET / Controller / SomeAction / XX au lieu de affectation.
Nous ne voulons pas que l'utilisateur OBTIENT cette URL, donc la suppression du filtre n'est pas une option pour nous. Au lieu de cela, nous avons simplement câblé l'événement onclick du lien d'action directement (nous avons dû modifier légèrement SomePostEventHandler () pour que cela fonctionne):
Donc, la morale de l'histoire, du moins pour nous, c'est que si vous voyez ces erreurs, retrouvez l'URL sur laquelle vous PENSEZ POSTER et assurez-vous que vous l'êtes.
la source
J'ai aussi eu ce problème.
Dans mon cas, il s'agissait de restrictions verbales sur l'action demandée, où la vue était un
POST
mais la vue partielle demandée dans pris en chargeGET
etHEAD
uniquement. L'ajout duPOST
verbe àAcceptVerbsAttribute
(dans MVC 1.0) a résolu le problème.la source
À partir des journaux IIS, notre problème a été causé par Googlebot tentant de POST et par un GET pour une action de contrôleur POST uniquement.
Pour ce cas, je recommande de gérer le 404 comme la suggestion Dmitriy.
la source
La réponse actuellement acceptée fonctionne comme prévu mais n'est pas le cas d'utilisation principal de la fonctionnalité. Utilisez plutôt la fonctionnalité définie par ASP.NET. Dans mon cas, j'ai tout nié mais GET et POST:
Avec l'extrait de code ci-dessus, MVC renverra correctement un 404
la source
Ne devrait-il pas être
Aussi, que font vos filtres? Ne peuvent-ils pas masquer l'action, comme ActionMethodSelectorAttribute?
la source
J'ai le même problème avec le téléchargement de fichiers qq
Lorsque l'action de publication est,
/Document/Save
j'obtiens l'exception. Une méthode d'action publique «Enregistrer» n'a pas été trouvée sur le contrôleur «Project.Controllers.DocumentController».Mais si l'action de publication est
/Document/Save/
, la publication est correcte et fonctionne!Dieu sauve le / ?
la source
Ma cause profonde était similaire à celle mentionnée dans le commentaire.
J'étais
ajaxSubmitting
une forme sur le clic d'un bouton. L'un des champs du formulaire était de typeDate
. Cependant, en raison de la différence dans les formats de date entre la machine client et serveur, il n'a pas exécuté la méthode POST dans le contrôleur. Le serveur a renvoyé une302
réponse, puis a renvoyé uneGET
demande pour la même méthode.Cependant, l'action dans le contrôleur a été décorée avec l'
HttpPost
attribut et par conséquent, il n'a pas pu trouver la méthode et a renvoyé une404
réponse.Je viens de corriger le code de telle sorte que l'incohérence dans les formats de date ne provoque pas d'erreur et le problème a été résolu.
la source
Supprimez les
[HttpGet]
attributs et cela fonctionnera :)la source
[HttpGet]
y ayez volontairement mis ces attributs, pour éviter que les actions ne soient appelées via d'autres VERBPour toute personne ayant ce problème avec les insertions angularjs, MVC et {{imagepath}} dans les attributs image src, par exemple:
"Une méthode d'action publique '{{imagepath}} previous.png' n'a pas été trouvée sur le contrôleur"
La solution est d'utiliser ng-src au lieu de src.
J'espère que cela aide quelqu'un :)
la source
Voyez si la simple navigation vers l'URL en question suffit à reproduire l'erreur. Ce serait le cas si l'action était uniquement définie comme une action POST. Cela vous permet de reproduire l'erreur à volonté.
Dans tous les cas, vous pouvez gérer globalement l'erreur comme ci-dessous. Une autre réponse ici qui fait référence
HandleUnknownAction
ne gère que les URL avec de mauvais noms d'action, pas de mauvais noms de contrôleur. L'approche suivante gère les deux.Ajoutez ceci à votre contrôleur de base (voir le code omis ici):
Ajoutez un gestionnaire d'exceptions global à Global.asax.cs qui appelle la méthode ci-dessus ou fait tout ce que vous voulez faire avec l'erreur 404 interceptée:
la source