2012-03-29 77 views
39

這不是一個重複的問題,問題讓我發瘋。我得到了一個典型的錯誤「在控制器Y上未找到公共操作方法X」,它返回404 Not Found。截圖給你一個好主意:404 - 在控制器Y上未找到公共操作方法X(ActionInvoker.InvokeAction返回false)

Visual Studio debugging session

圖顯示了調試器拋出執行base.HandleUnknownAction(actionName))異常的行權之前暫停。現在,在您得出結論之前,您可以看到以下信息:

  1. 這在某種程度上工作得很好。
  2. 該動作(請參閱上面的方法簽名註釋)應接受HTTP動詞(GET)作爲UpdateCart操作。
  3. 發送的參數無關緊要:錯誤發生在POST,GET以及任意參數組合上。
  4. 同一控制器中的其他類似操作可以很好地工作。
  5. 我用UpdateCart的截圖標記爲virtual,但刪除virtual沒有什麼區別。
  6. 該屏幕截圖顯示ActionInvoker.InvokeAction(this.ControllerContext, "UpdateCart")返回假。不知道爲什麼通過我的控制器執行的反射無法找到該方法,但它是正確的!

這些路由是默認的路由,他們的工作,否則我不能停止調試器採取上述截圖。這裏的代碼從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 } 
    ); 

} 

任何想法非常感謝。

編輯

森·布朗的下面的答案是正確的:HttpGetHttpPost是互斥的。解決方案是用[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]替換這些屬性。

+0

你在做任何URL重寫? – MikeSW 2012-03-29 18:44:35

+0

沒有。沒有URL重寫。注意調試器到了多​​遠! – Diego 2012-03-29 18:50:15

+1

+1表示一個很好的措辭和記錄的問題。除了魔術清理/重建解決方案之外,沒有任何想法。抱歉。 – Tommy 2012-03-29 19:26:30

回答

58

問題是,您正在指定HttpGetHttpPost屬性。如果您將它們都關閉,則該操作將同時接受POST和GET請求。我的猜測是HttpGetHttpPost屬性沒有向MVC發信號以允許相應的請求類型,但是對於拒絕的相反類型。因此,通過包含[HttpPost],您拒絕GET請求,並且通過包含[HttpGet],您拒絕POST請求...有效拒絕所有請求類型。保持屬性關閉,它將接受這兩種類型。

更新:我剛剛檢查了MVC源代碼,並且我的假設是正確的。在ActionMethodSelector,它會檢查屬性正是如此:

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

換句話說,對於要調用的操作的所有ActionMethodSelectorAttribute(從HttpPostAttributeHttpGetAttribute派生)必須返回true。一個或另一個總是會返回false,所以這個動作永遠不會執行。

+4

使用「如此」一詞。 Upvoted。 – 2014-12-04 06:54:27

+0

這對'使用System.Web.Http;'和'使用System.Web.MVC'都是一樣的嗎?即'使用System.Web.Http'還會發出'拒絕'信號還是特定於mvc版本?我問,因爲我剛剛從api項目和一個正常的網站項目中剔除了動詞。網站的行爲就像你描述的一樣,但沒有任何動詞的api項目根本無法再找到動作(它既有獲取又有後附連)......所以無論「System.Web.Http」的行爲是否有所不同,導致它在我的路由綁定器....:S – 2015-12-23 06:35:50

+0

您猜測'HttpGet'和'HttpPost'屬性信號到MVC否認相反的類型是不正確的。通過添加任何http動詞屬性,您表示該方法只支持該動詞。所以列出的第一個執行並拒絕請求,如果它不是正確的動詞。這就是爲什麼'AcceptVerbs'起作用的原因,因爲它允許列表。 – 2016-03-23 15:14:38

1

小心:在我的情況下,當試圖達到新的操作方法時,出現500錯誤。

IIS 8.5詳細錯誤 - 500.0 - 公共動作方法 'getwells' 是 不在控制器 發現 'ITVizion.VizionLogs.Widgets.Controllers.MapController'。

我將操作方法​​添加到控制器,並將更新的應用程序「部署」到IIS。

問題:我在Visual Studio中部署Debug配置,並取消選中該建築的特定項目。這是爲了加快在Visual Studio中的構建,因爲解決方案中有很多項目。 :D去IIS應用程序文件夾,我看到該項目的DLL已過時。

因此,請確保您檢查項目生成。 :)這顯然會負責將新的codez部署到IIS。

enter image description here

相關問題