title: Intermittent asp.net mvc exception: “A public action method ABC could not be found on controller XYZ.”
body: <p>I'm getting an intermittent exception saying that asp.net mvc can’t find the action method. Here’s the exception:</p>
  
  <blockquote>
    <p>A public action method 'Fill' could
    not be found on controller
    'Schoon.Form.Web.Controllers.ChrisController'.</p>
  </blockquote>
  
  <p>I think I have the routing set up correctly because this application works most of the time. Here is the controller’s action method.</p>
  
  <pre><code>[ActionName("Fill")]
  [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
  public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
  {
       //…
  }
  </code></pre>
  
  <p>The route:</p>
  
  <pre><code>routes.MapRoute(
          "SchoonForm",
          "Form/Fill/{subscriberId}",
          new { controller = "ChrisController", action = "Fill" },
          new { subscriberId = @"\d+" }
      );
  </code></pre>
  
  <p>And here is the stack:</p>
  
  <blockquote>
    <p>System.Web.HttpException: A public
    action method 'Fill' could not be
    found on controller
    'Schoon.Form.Web.Controllers.ChrisController'.
    at
    System.Web.Mvc.Controller.HandleUnknownAction(String
    actionName) in
    C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\Controller.cs:line
    197  at
    System.Web.Mvc.Controller.ExecuteCore()
    in
    C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\Controller.cs:line
    164  at
    System.Web.Mvc.ControllerBase.Execute(RequestContext
    requestContext) in
    C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\ControllerBase.cs:line
    76  at
    System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext
    requestContext) in
    C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\ControllerBase.cs:line
    87  at
    System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase
    httpContext) in
    C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs:line
    80  at
    System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext
    httpContext) in
    C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs:line
    68  at
    System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext
    httpContext) in
    C:\dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs:line
    104  at
    System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
    at
    System.Web.HttpApplication.ExecuteStep(IExecutionStep
    step, Boolean&amp; completedSynchronously)</p>
  </blockquote>
  
  <p>Here is an example of my filters they all work the same way:</p>
  
  <pre><code>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);
      }
  }
  </code></pre>
  
  <p>Thanks,
  Chris</p>