404 – 在控制器Y上未find公共操作方法X(ActionInvoker.InvokeAction返回false)
这不是一个重复的问题,这个问题让我疯狂。 我得到了一个典型的错误“在控制器Y上找不到公共操作方法X”,它返回一个404 Not Found
。 截图给你一个好主意:
该图显示debugging器在引发exception的行被执行之前暂停 ( base.HandleUnknownAction(actionName)
)。 现在,在你进入结论之前,这里有一些信息:
- 这在一定程度上工作得很好。
- 应该为
UpdateCart
操作接受HTTP动词(GET
)(请参阅上面的方法签名注释)。 - 发送的参数是不相关的:错误发生在
POST
,GET
和任何参数的组合上。 - 在同一个控制器中的其他类似的行为也很好。
- 我用截图
UpdateCart
标记virtual
,但删除virtual
没有任何区别。 - 截图显示
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的答案是正确的: HttpGet
和HttpPost
是互斥的。 解决scheme是用[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
replace这些属性。
问题是你指定HttpGet
和HttpPost
属性。 如果将两者都closures,则该操作同时接受POST和GET请求。 我的猜测是, HttpGet
和HttpPost
属性不会通知MVC允许相应的请求types,但拒绝相反的types。 所以通过包含[HttpPost]
,您拒绝GET请求,并且通过包含[HttpGet]
,您拒绝POST请求…有效地拒绝所有请求types。 保持属性closures,它将接受这两种types。
更新 :我只是检查了MVC的来源,我的假设是正确的。 在ActionMethodSelector
,它检查属性如下:
if (attrs.All(attr => attr.IsValidForRequest(controllerContext, methodInfo))) { matchesWithSelectionAttributes.Add(methodInfo); }
换句话说,所有ActionMethodSelectorAttribute
(从中派生HttpPostAttribute
和HttpGetAttribute
)都必须返回true来执行要调用的动作。 一个或另一个总是会返回false,所以这个动作永远不会执行。
注意:在我的情况下,当试图达到一个新的操作方法时,我得到了一个500错误。
IIS 8.5详细错误 – 500.0 – 未在控制器“ITVizion.VizionLogs.Widgets.Controllers.MapController”上find公共操作方法“getwells”。
我将操作方法添加到控制器,并将更新的应用程序“部署”到IIS。
问题是:我在Visual Studio中部署了Debug
configuration,并没有从build筑物中选中这个特定的项目。 这是为了加快Visual Studio中的构build,因为解决scheme中有很多项目。 :D去IIS应用程序文件夹,我看到该项目的DLL是过时的。
所以确保你检查项目build立。 :)这显然会照顾部署新的codez到IIS。