.net 404-在控制器Y上未找到公共操作方法X(ActionInvoker.InvokeAction返回false)

.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和任何参数

这不是一个重复的问题,这个问题让我发疯。我得到一个典型错误“在控制器Y上找不到一个公共操作方法X”,它返回一个
404 not found
。屏幕截图为您提供了一个好主意:

该图像显示了在执行引发异常的行之前暂停的调试器(
base.HandleUnknownAction(actionName)
)。现在,在你下结论之前,这里有一些信息:

  • 这在某种程度上非常有效
  • HTTP动词(
    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
    可以工作的原因,因为它允许列表。