.net 404-在控制器Y上未找到公共操作方法X(ActionInvoker.InvokeAction返回false)
这不是一个重复的问题,这个问题让我发疯。我得到一个典型错误“在控制器Y上找不到一个公共操作方法X”,它返回一个.net 404-在控制器Y上未找到公共操作方法X(ActionInvoker.InvokeAction返回false),.net,asp.net-mvc,asp.net-mvc-3,.net-4.0,.net,Asp.net Mvc,Asp.net Mvc 3,.net 4.0,这不是一个重复的问题,这个问题让我发疯。我得到一个典型错误“在控制器Y上找不到一个公共操作方法X”,它返回一个404 not found。屏幕截图为您提供了一个好主意: 该图像显示了在执行引发异常的行之前暂停的调试器(base.HandleUnknownAction(actionName))。现在,在你下结论之前,这里有一些信息: 这在某种程度上非常有效 HTTP动词(GET)应该被UpdateCart操作接受(请参见方法签名上方的注释) 发送的参数不相关:错误发生在POST、GET和任何参数
404 not found
。屏幕截图为您提供了一个好主意:
该图像显示了在执行引发异常的行之前暂停的调试器(base.HandleUnknownAction(actionName)
)。现在,在你下结论之前,这里有一些信息:
GET
)应该被UpdateCart
操作接受(请参见方法签名上方的注释)POST
、GET
和任何参数组合中UpdateCart
标记了virtual
,但是删除virtual
没有什么区别ActionInvoker.InvokeAction(this.ControllerContext,“UpdateCart”)
返回false。不确定为什么在我的控制器上执行的反射找不到方法,但它就在那里李>
这些路由是默认路由,它们可以工作,否则我就无法停止调试器以获取上面的屏幕截图。以下是来自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 }
);
}
非常感谢您的任何想法
编辑
伊桑·布朗在下面的回答是正确的:
HttpGet
和HttpPost
是相互排斥的。解决方案是将这些属性替换为[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
问题是您同时指定了HttpGet
和HttpPost
属性。如果您同时关闭这两个选项,则操作将同时接受POST和GET请求。我猜想HttpGet
和HttpPost
属性不会向MVC发出允许相应请求类型的信号,而是拒绝相反的类型。因此,通过包含[HttpPost]
,您拒绝了GET请求,通过包含[HttpGet]
,您拒绝了POST请求……有效地拒绝了所有请求类型。关闭属性,它将接受这两种类型
更新:我刚刚检查了MVC源代码,我的假设是正确的。在ActionMethodSelector
中,它检查属性,从而:
if (attrs.All(attr => attr.IsValidForRequest(controllerContext, methodInfo))) {
matchesWithSelectionAttributes.Add(methodInfo);
}
换句话说,所有
ActionMethodSelectorAttribute
(其中HttpPostAttribute
和HttpGetAttribute
派生)必须返回true才能调用操作。一个或另一个总是返回false,因此操作永远不会执行。注意:在我的情况下,在尝试达到新的操作方法时,我遇到了500个错误
IIS 8.5详细错误-500.0-出现公共操作方法“getwells”
在控制器上找不到
'ITVizion.VizionLogs.Widgets.Controllers.MapController'
我将操作方法添加到控制器,并将更新的应用程序“部署”到IIS
问题是:我在VisualStudio中部署了调试配置,并且从构建中取消选中了该特定项目。这是为了加快Visual Studio中的构建速度,因为解决方案中有很多项目:D转到IIS应用程序文件夹时,我看到项目的DLL已过时
因此,请确保检查要构建的项目。:)这显然将负责将新的codez部署到IIS
您是否正在重写url?没有。没有URL重写。注意调试器到了什么程度+一个措辞严谨、有文件证明的问题。除了神奇的清洁/重建解决方案技巧之外,没有其他想法。抱歉。这闻起来像MVC错误。这对使用System.Web.Http的和代码>和使用System.Web.MVC
?i、 e.是否使用System.Web.Http代码>还发出“拒绝”信号,或者这是特定于mvc版本的吗?我这样问是因为我刚刚从一个api项目和一个普通的网站项目中取出动词。WebsiteOne的行为与您描述的一样,但是没有任何谓词的api项目再也找不到该操作(它同时具有get和post附件)。。。因此,要么是System.Web.Http
的行为不同,要么是我的路由绑定器中的其他原因造成了这种情况sy您认为HttpGet
和HttpPost
属性向MVC发出拒绝相反类型的信号是不完全正确的。通过添加任何http谓词属性,表明该方法仅支持该谓词。因此,列出的第一个执行并拒绝请求,如果它不是正确的动词。这就是为什么AcceptVerbs
可以工作的原因,因为它允许列表。