404 – 在控制器Y上未find公共操作方法X(ActionInvoker.InvokeAction返回false)

这不是一个重复的问题,这个问题让我疯狂。 我得到了一个典型的错误“在控制器Y上找不到公共操作方法X”,它返回一个404 Not Found 。 截图给你一个好主意:

Visual Studio调试会话

该图显示debugging器在引发exception的行被执行之前暂停base.HandleUnknownAction(actionName) )。 现在,在你进入结论之前,这里有一些信息:

  1. 这在一定程度上工作得很好。
  2. 应该为UpdateCart操作接受HTTP动词( GET )(请参阅上面的方法签名注释)。
  3. 发送的参数是不相关的:错误发生在POSTGET和任何参数的组合上。
  4. 在同一个控制器中的其他类似的行为也很好。
  5. 我用截图UpdateCart标记virtual ,但删除virtual没有任何区别。
  6. 截图显示ActionInvoker.InvokeAction(this.ControllerContext, "UpdateCart")返回false 。 不知道为什么我的控制器执行的reflection无法find的方法,但它是正确的!

路由是默认的,他们的工作,否则我不能停止debugging器采取上面的截图。 以下是Global.asax.cs的代码:

 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Tickets", action = "Index", id = UrlParameter.Optional } ); } 

任何想法,不胜感激。

编辑

Ethan Brown的答案是正确的: HttpGetHttpPost是互斥的。 解决scheme是用[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]replace这些属性。

问题是你指定HttpGetHttpPost属性。 如果将两者都closures,则该操作同时接受POST和GET请求。 我的猜测是, HttpGetHttpPost属性不会通知MVC允许相应的请求types,但拒绝相反的types。 所以通过包含[HttpPost] ,您拒绝GET请求,并且通过包含[HttpGet] ,您拒绝POST请求…有效地拒绝所有请求types。 保持属性closures,它将接受这两种types。

更新 :我只是检查了MVC的来源,我的假设是正确的。 在ActionMethodSelector ,它检查属性如下:

 if (attrs.All(attr => attr.IsValidForRequest(controllerContext, methodInfo))) { matchesWithSelectionAttributes.Add(methodInfo); } 

换句话说,所有ActionMethodSelectorAttribute (从中派生HttpPostAttributeHttpGetAttribute )都必须返回true来执行要调用的动作。 一个或另一个总是会返回false,所以这个动作永远不会执行。

注意:在我的情况下,当试图达到一个新的操作方法时,我得到了一个500错误。

IIS 8.5详细错误 – 500.0 – 未在控制器“ITVizion.VizionLogs.Widgets.Controllers.MapController”上find公共操作方法“getwells”。

我将操作方法​​添加到控制器,并将更新的应用程序“部署”到IIS。

问题是:我在Visual Studio中部署了Debugconfiguration,并没有从build筑物中选中这个特定的项目。 这是为了加快Visual Studio中的构build,因为解决scheme中有很多项目。 :D去IIS应用程序文件夹,我看到该项目的DLL是过时的。

所以确保你检查项目build立。 :)这显然会照顾部署新的codez到IIS。

在这里输入图像说明