webdevqa.jp.net

404-パブリックアクションメソッドXがコントローラーYで見つかりませんでした(ActionInvoker.InvokeActionはfalseを返します)

これは重複した質問ではなく、問題が私を狂わせています。 _404 Not Found_を返す一般的なエラー「コントローラーYでパブリックアクションメソッドXが見つかりませんでした」が表示されます。スクリーンショットはあなたに良い考えを与えます:

Visual Studio debugging session

画像は、例外をスローする行が実行される直前にデバッガが一時停止していることを示していますbase.HandleUnknownAction(actionName))。さて、結論に飛びつく前に、ここにいくつかの情報があります:

  1. これはある時点で完全にうまくいきました。
  2. HTTP動詞(GET)は、UpdateCartアクションによって受け入れられる必要があります(メソッドシグネチャの上の注釈を参照)。
  3. 送信されるパラメータは無関係です。エラーはPOSTGET、およびパラメータの任意の組み合わせで発生します。
  4. 同じコントローラー内の他の同様のアクションはうまく機能します。
  5. UpdateCartvirtualとマークされたスクリーンショットを撮りましたが、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の答えは正しいです:HttpGetHttpPostは相互に排他的です。解決策は、これらの属性を[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]で置き換えることでした。

39
Diego

問題は、HttpGet属性とHttpPost属性の両方を指定していることです。両方をオフのままにすると、アクションはPOSTおよびGETリクエストの両方を受け入れます。私の推測では、HttpGetおよびHttpPost属性は、 MVCは対応する要求タイプを許可しますが、反対のタイプはdenyにします。したがって、[HttpPost]を含めることで、GET要求を拒否し、 [HttpGet]を含めることで、POSTリクエスト...実質的にすべてのリクエストタイプを拒否します。属性をオフのままにすると、両方のタイプが受け入れられます。

pdate:MVCソースを確認したところ、私の想定は正しいです。 ActionMethodSelectorでは、属性を次のようにチェックします。

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

つまり、すべてのActionMethodSelectorAttributeHttpPostAttributeおよびHttpGetAttributeの派生元)は、アクションが呼び出されるためにtrueを返す必要があります。どちらか一方は常にfalseを返すため、アクションは実行されません。

58
Ethan Brown

注意:私の場合、新しいアクションメソッドに到達しようとすると500エラーが発生しました。

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

アクションメソッドをコントローラーに追加し、更新されたアプリをIISに "展開"していました。

問題:Visual StudioでDebug構成を展開していて、その特定のプロジェクトのビルドをオフにしていました。ソリューションには多くのプロジェクトがあるため、Visual Studioでのビルドを高速化するためです。 :D IIS appフォルダーに移動すると、プロジェクトのDLLが古くなっていることがわかりました。

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

enter image description here

1