web-dev-qa-db-ja.com

要求に一致するアクションがコントローラーで見つかりませんでした

この分野で私の無知を許してください。多くのスレッドを読みましたが、ルーティングを正しく取得できません。

このようなProductsControllerがあります:

public class ProductsController : ApiController
{
    [ActionName("GetListOfStudents")]
    public static List<Structures.StudentInfo> GetListOfStudents(string Username, string Password)
    {
        List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
        return si;
    }
}

ルートを定義したコンソールテストプログラムがあります。

config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/products/GetListOfStudents",
defaults: new { controller = "products", action = "GetListOfStudents" });

しかし、私が電話をかけるとき

GET http://localhost:8080/api/Products/GetListOfStudents

エラーメッセージが表示されます。

MessageDetail=No action was found on the controller 'Products' that matches the name 'GetListOfStudents'.

私は自分の髪を抜いてきたので、正しいルートがどうあるべきかを判断できません。

親切な人は私を助けてくれますか?

15
Trevor Daniel

わかりました-ヘルプを覗いてくれてありがとう!

これは私がそれを機能させるためにしたことです:

  1. GetListOfStudents関数から「静的」を削除しました。
  2. 以下のルートを追加しました。
config.Routes.MapHttpRoute(
  name: "ApiByAction",
  routeTemplate: "api/products/GetListOfStudents/{username}/{password}",
  defaults: new { controller = "products", action = "GetListOfStudents" }
);

皆さん、助けてくれてありがとう!

13
Trevor Daniel

グローバルAPIアクセスポイントを登録するとき、使用するルートを次の方法で構成に伝える必要があります。

config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/{controller}/{action}
defaults: new { controller = "products", action = "GetListOfStudents" });

このサンプルでは、​​コントローラに「製品」コントローラにのみアクセスするように明示的に指示します。コントロールまたはアクションを指定せずに汎用にすることができ、次のようにデフォルトを省略します。

config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/{controller}/{action}

それは仕事をするはずです:)

11
Yuval Itzchakov

GetListOfStudentsアクションには、ユーザー名とパスワードの2つのパラメーターが必要です。ただし、ルート定義には、これらのパラメーターの値が由来するルートテンプレートの仕様も、defaults:パラメーター定義のこれらのパラメーターのデフォルトの仕様も含まれていません。

そのため、リクエストが到着すると、ルーティングはコントローラーを見つけることができますが、ユーザー名とパスワードのパラメーターに関する情報がないため、リクエストで呼び出すことができるアクションと、持っているコンテキストをルーティングすることができません。

6
LB2

最も重要なのは、ASP.Netのmvcは名前でアクションをシークするだけでなく、メソッドのシグネチャをチェックし、メソッドはnon-staticname matchesおよびparameters matches、アクションが実行されます。

あなたの場合、それを修正する2つの方法があります。 1つの方法は、デフォルト値を宣言することです。mvcは、パラメーターが見つからない場合にデフォルト値を使用します。

public List<Structures.StudentInfo> GetListOfStudents(string Username = null, string Password = null)
{
    List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
    return si;
}

2番目の方法はオーバーライドを使用することです

public List<Structures.StudentInfo> GetListOfStudents()
{
   return GetListOfStudents(null, null);
}

public List<Structures.StudentInfo> GetListOfStudents(string Username, string Password)
{
    List<Structures.StudentInfo> si = StudentFunctions.GetListOfStudents(Username, Password);
    return si;
}
5
dexiang

パラメーターなしでGetListOfStudentsメソッドを呼び出す場合は、パラメーターのデフォルト値を設定する必要があります。 GetListOfStudents(string Username = null、string Password = null)など。それ以外の場合は、パラメーターを指定してメソッドを呼び出す必要があります。 GET http:// localhost:8080/api/Products/GetListOfStudents/Username/Password

私はこの問題を抱えており、アクションの一部として動詞を含めることで解決しました(つまり、GetThis、GetThat)、手動でルートを作成しました。属性を使用してルートを作成しようとしましたが、うまくいきませんでした。この SOの質問 は、属性が機能しない理由についての答えかもしれませんが、まだまっすぐになっていないようです。同じ問題を抱えている他の人への追加の注意事項として、ローカルでデバッグするとき、「アクションが見つかりません」というxmlが返されたときにIEがクラッシュしていました。メッセージの詳細が返され、少なくとも私のコントローラーが見つかっていることは明らかでした。アクションを機能させるだけの問題でした...

0
jmoreno

1つの問題は、WebApiConfig.csファイル内のルート宣言の順序です。ルートの優先順位について here を見てください。同じ量のパラメーターを持つ2つのルートがある場合、ルートを並べ替える必要がある場合があります。

0
Adam Hey