2012-03-29 150 views
39

これは重複した質問ではなく、問題は私を狂わせてしまいます。私は典型的なエラー "公共のアクションメソッドXはコントローラYに見つかりませんでした"を返しています。これは404 Not Foundを返します。404 - パブリックアクションメソッドXがコントローラーYに見つかりませんでした(ActionInvoker.InvokeActionがfalseを返します)

Visual Studio debugging session

画像は、デバッガがbase.HandleUnknownAction(actionName))が実行される例外をスローする行の前に右の一時停止を示しています。スクリーンショットは、あなたに良いアイデアを提供します。結論に至る前に、ここにいくつかの情報があります:

  1. これはある時点で完璧に機能していました。
  2. HTTP動詞(GET)は、UpdateCartアクションで受け入れる必要があります(メソッドシグネチャの注釈を参照)。
  3. 送信されるパラメータは無関係です。エラーは、POST,GETおよび任意のパラメータの組み合わせで発生します。
  4. 同じコントローラ内の他の同様の動作はうまく機能します。
  5. UpdateCartvirtualと表示されたスクリーンショットを撮りましたが、virtualを削除すると違いはありません。
  6. このスクリーンショットは、ActionInvoker.InvokeAction(this.ControllerContext, "UpdateCart")が偽を返すことを示しています。私のコントローラ上で実行されたリフレクションがそのメソッドを見つけることができない理由はわかりませんが、それは正しいです!

ルートはデフォルトのもので、それ以外の場合は上記のスクリーンショットを取るためにデバッガを停止できないため、動作します。任意のアイデアを大歓迎している

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 } 
    ); 

} 

:ここGlobal.asax.csからのコードです。以下

EDIT

イーサン・ブラウンの答えは正しいです:HttpGetHttpPostは相互に排他的です。解決方法は、これらの属性を[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]に置き換えることでした。

+0

あなたは書き換え任意のURLをやっていますか? – MikeSW

+0

Nope。 URLの書き換えはありません。デバッガがどこまで到達したかに注意してください! – Diego

+1

+1熟語と文書化された質問の場合+1。マジッククリーン/リビルドソリューション以外のアイデアはありません。ごめんなさい。 – Tommy

答えて

58

HttpGetHttpPostの両方の属性を指定しているという問題があります。両方をオフのままにすると、アクションはPOST要求とGET要求の両方を受け入れます。私の推測では、HttpGetHttpPostの属性は、対応する要求タイプを許可するためにMVCに信号を送るのではなく、を否定すると、反対のタイプのになります。したがって、[HttpPost]を含めると、GETリクエストが拒否され、[HttpGet]を含めると、POSTリクエストを拒否しています...すべてのリクエストタイプを効果的に拒否しています。属性をオフのままにしておくと、両方の型を受け入れます。

更新:MVCソースを確認したところ、私の前提は正しいです。 ActionMethodSelectorでは、それは以下のようなものを属性チェック:アクションが呼び出されるため言い換えれば

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

を、すべてActionMethodSelectorAttributeHttpPostAttributeHttpGetAttribute派生から)がtrueを返す必要があります。どちらか一方は常にfalseを返すので、アクションは決して実行されません。

+4

"suchly"という言葉の使用。 Upvoted。 –

+0

これは 'using System.Web.Http;'と 'using System.Web.MVC'の両方で同じですか?すなわち、 'using System.Web.Http; 'もまた' deny 'を通知するか、これはmvcのバージョンに特有のものですか?私はちょうどapiプロジェクトと通常のウェブサイトプロジェクトから動詞を取り出したので私は尋ねます。ウェブサイトはあなたが記述したように振る舞いますが、動詞のないapiプロジェクトでは、アクションを見つけることができなくなります(これは取得と送信の両方が行われています)... "System.Web.Http"の動作が異なるか、私のルートバインダーでそれを引き起こしています....:S –

+0

'HttpGet'と' HttpPost'属性が反対のタイプを否定するためにMVCに信号を送るのは間違いです。 http動詞属性のいずれかを追加することによって、メソッドがその動詞のみをサポートしていることを示しています。最初にリストされたものが実行され、正しい動詞でない場合は要求が拒否されます。これは、リストを許可するため、 'AcceptVerbs'が動作する理由です。 –

1

気をつけてください:私の場合は、新しいアクションメソッドに到達しようとすると500のエラーが発生しました。

8.5詳細エラーIIS - 公共のアクションメソッド 'getwells' コントローラ で見つかりませんでした 'ITVizion.VizionLogs.Widgets.Controllers.MapController' - 500.0が。

コントローラにアクションメソッドを追加し、更新されたアプリケーションをIISに「デプロイ」しました。

問題:Visual StudioでDebugの設定を展開していて、その特定のプロジェクトのビルドをチェックしていませんでした。これは、ソリューションに多くのプロジェクトがあるため、Visual Studioでのビルドをスピードアップすることでした。 :D IISのアプリケーションフォルダに移動するプロジェクトのDLLが古くなっていることがわかりました。

プロジェクトをビルドすることを確認してください。 :)これは明らかに新しいcodezをIISに配備することになります。

enter image description here

関連する問題