この分野で私の無知を許してください。多くのスレッドを読みましたが、ルーティングを正しく取得できません。
このような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'.
私は自分の髪を抜いてきたので、正しいルートがどうあるべきかを判断できません。
親切な人は私を助けてくれますか?
わかりました-ヘルプを覗いてくれてありがとう!
これは私がそれを機能させるためにしたことです:
config.Routes.MapHttpRoute(
name: "ApiByAction",
routeTemplate: "api/products/GetListOfStudents/{username}/{password}",
defaults: new { controller = "products", action = "GetListOfStudents" }
);
皆さん、助けてくれてありがとう!
グローバル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}
それは仕事をするはずです:)
GetListOfStudents
アクションには、ユーザー名とパスワードの2つのパラメーターが必要です。ただし、ルート定義には、これらのパラメーターの値が由来するルートテンプレートの仕様も、defaults:
パラメーター定義のこれらのパラメーターのデフォルトの仕様も含まれていません。
そのため、リクエストが到着すると、ルーティングはコントローラーを見つけることができますが、ユーザー名とパスワードのパラメーターに関する情報がないため、リクエストで呼び出すことができるアクションと、持っているコンテキストをルーティングすることができません。
最も重要なのは、ASP.Netのmvcは名前でアクションをシークするだけでなく、メソッドのシグネチャをチェックし、メソッドはnon-static、name 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;
}
パラメーターなしでGetListOfStudentsメソッドを呼び出す場合は、パラメーターのデフォルト値を設定する必要があります。 GetListOfStudents(string Username = null、string Password = null)など。それ以外の場合は、パラメーターを指定してメソッドを呼び出す必要があります。 GET http:// localhost:8080/api/Products/GetListOfStudents/Username/Password
私はこの問題を抱えており、アクションの一部として動詞を含めることで解決しました(つまり、GetThis、GetThat)、手動でルートを作成しました。属性を使用してルートを作成しようとしましたが、うまくいきませんでした。この SOの質問 は、属性が機能しない理由についての答えかもしれませんが、まだまっすぐになっていないようです。同じ問題を抱えている他の人への追加の注意事項として、ローカルでデバッグするとき、「アクションが見つかりません」というxmlが返されたときにIEがクラッシュしていました。メッセージの詳細が返され、少なくとも私のコントローラーが見つかっていることは明らかでした。アクションを機能させるだけの問題でした...
1つの問題は、WebApiConfig.csファイル内のルート宣言の順序です。ルートの優先順位について here を見てください。同じ量のパラメーターを持つ2つのルートがある場合、ルートを並べ替える必要がある場合があります。