92 votes

Exception intermittente asp.net mvc : "Une méthode d'action publique ABC n'a pas pu être trouvée sur le contrôleur XYZ."

Je reçois une exception intermittente disant que asp.net mvc ne peut pas trouver la méthode d'action. Voici l'exception :

Une méthode d'action publique "Fill" pourrait ne pas être trouvée sur le contrôleur Schoon.Form.Web.Controllers.ChrisController'.

Je pense avoir configuré le routage correctement 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)
{
     //…
}

L'itinéraire :

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

Et voici la pile :

System.Web.HttpException : Une action publique d'action publique 'Fill' n'a pas pu être trouvé sur le contrôleur Schoon.Form.Web.Controllers.ChrisController'. à l'adresse 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:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs :ligne 80 chez System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs :ligne 68 à System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) dans C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs :ligne 104 à System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() à l'adresse System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

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

28 votes

J'ai eu un problème similaire qui, je pense, mérite d'être signalé ici car c'est le premier résultat qui est apparu dans Google lors de la recherche de l'exception ci-dessus. Mon application a généré cette exception lors de la soumission d'un formulaire invalide. Cela était dû au fait que la page qui était (re)rendue appelait RenderAction et que l'action qui était appelée pour rendre une vue partielle était marquée avec l'attribut HttpGet, la suppression de cet attribut a résolu le problème.

3 votes

J'ai également remarqué ce comportement - peut-être est-il préférable de ne pas appliquer d'attributs Http aux méthodes du contrôleur qui renvoient des PartialViewResults.

1 votes

@s1mm0t : a raison. Pour mon cas, son commentaire a résolu le problème.

2voto

Zoom Points 36

D'après les journaux d'IIS, notre problème a été causé par Googlebot qui a tenté de faire un POST et un GET pour une action de contrôleur POST uniquement.

Dans ce cas, je recommande de traiter la 404 comme le suggère Dmitriy.

1voto

Valchris Points 731

La réponse actuellement acceptée fonctionne comme prévu, mais ne constitue pas le cas d'utilisation principal de la fonctionnalité. Utilisez plutôt la fonctionnalité définie par ASP.NET. Dans mon cas, j'ai refusé tout sauf GET et POST :

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

Avec l'extrait de code ci-dessus, MVC renverra correctement un message 404.

0voto

queen3 Points 8810

Cela ne devrait-il pas être

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

Aussi, à quoi servent vos filtres ? Ils ne peuvent pas cacher l'action, comme ActionMethodSelectorAttribute ?

0 votes

C'est une erreur d'édition. J'essayais de protéger les innocents.

0 votes

Ils remplissent certains des paramètres. Par exemple, le UserIdFilter est une aide pour obtenir l'identifiant de l'utilisateur à partir de la session, du cookie, etc. Il remplit le premier paramètre. Je vais éditer le post pour l'inclure.

0voto

Tuizi Points 417

J'ai le même problème avec qq Téléchargement de fichiers

Lorsque la post action est /Document/Save Je reçois l'exception Une méthode d'action publique 'Save' n'a pas été trouvée sur le contrôleur 'Project.Controllers.DocumentController'.

Mais si la post action est /Document/Save/ le post est correct et fonctionne !

Dieu sauve le / ?

0voto

mridula Points 977

Ma cause première était similaire à celle mentionnée dans le commentaire.

J'étais ajaxSubmitting un formulaire en cliquant sur un bouton. L'un des champs du formulaire est de type Date . Cependant, en raison de la différence de format de date entre le client et le serveur, la méthode POST n'a pas été exécutée dans le contrôleur. Le serveur a renvoyé un 302 et a ensuite envoyé un GET demander à nouveau la même méthode.

Cependant, l'action dans le contrôleur a été décorée avec la balise HttpPost et n'a donc pas pu trouver la méthode et a renvoyé un message d'erreur 404 réponse.

J'ai simplement corrigé le code de façon à ce que le décalage des formats de date ne provoque pas d'erreur et le problème a été résolu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X