Dot-Net

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

  • March 29, 2012

這不是一個重複的問題,這個問題讓我發瘋。我收到典型錯誤“在控制器 Y 上找不到公共操作方法 X”,它返回一個404 Not Found. 截圖給你一個好主意:

Visual Studio 調試會話

該圖顯示調試器在執行引發異常的行之前暫停base.HandleUnknownAction(actionName))。現在,在你下結論之前,這裡有一些資訊:

  1. 這在某些時候工作得非常好。
  2. HTTP 動詞 ( GET) 應該被UpdateCart操作接受(參見方法簽名上面的註釋)。
  3. 發送的參數無關緊要:錯誤發生在POST,GET和任何參數組合。
  4. 同一控制器中的其他類似操作執行良好。
  5. 我截取了帶有UpdateCart標記的螢幕截圖virtual,但刪除virtual沒有任何區別。
  6. 螢幕截圖顯示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 } 
   );

}

任何想法都非常感謝。

編輯

Ethan Brown 在下面的回答是正確的:HttpGet並且HttpPost是相互排斥的。解決方案是將這些屬性替換為[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)].

問題是您同時指定了HttpGetHttpPost屬性。如果您將它們都關閉,則該操作同時接受 POST 和 GET 請求。我的猜測是HttpGetandHttpPost屬性不會向 MVC 發出信號以允許相應的請求類型,而是拒絕相反的類型。因此,通過 include [HttpPost],您拒絕了 GET 請求,通過 include [HttpGet],您拒絕了 POST 請求……實際上拒絕了所有請求類型。關閉屬性,它將接受這兩種類型。

更新:我剛剛檢查了 MVC 源,我的假設是正確的。在ActionMethodSelector中,它因此檢查屬性:

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

換句話說,所有ActionMethodSelectorAttribute(從中HttpPostAttributeHttpGetAttribute派生)都必須返回 true 才能呼叫操作。一個或另一個總是會返回 false,因此該操作將永遠不會執行。

引用自:https://stackoverflow.com/questions/9931437