[解決済み] ASP.NET Web APIのカスタムメソッド名
質問
WCF Web APIから新しいASP.NET MVC 4 Web APIに変換しているところです。私はUsersControllerを持っており、Authenticateという名前のメソッドを持ちたいと思っています。GetAll、GetOne、Post、Deleteの例を見ましたが、これらのサービスに追加のメソッドを追加したい場合はどうすればよいでしょうか。例えば、私のUsersServiceにはAuthenticateというメソッドがあり、ユーザ名とパスワードを渡すはずですが、うまくいきません。
public class UsersController : BaseApiController
{
public string GetAll()
{
return "getall!";
}
public string Get(int id)
{
return "get 1! " + id;
}
public User GetAuthenticate(string userName, string password, string applicationName)
{
LogWriter.Write(String.Format("Received authenticate request for username {0} and password {1} and application {2}",
userName, password, applicationName));
//check if valid leapfrog login.
var decodedUsername = userName.Replace("%40", "@");
var encodedPassword = password.Length > 0 ? Utility.HashString(password) : String.Empty;
var leapFrogUsers = LeapFrogUserData.FindAll(decodedUsername, encodedPassword);
if (leapFrogUsers.Count > 0)
{
return new User
{
Id = (uint)leapFrogUsers[0].Id,
Guid = leapFrogUsers[0].Guid
};
}
else
throw new HttpResponseException("Invalid login credentials");
}
}
myapi/api/users/をブラウズするとGetAllが、myapi/api/users/1をブラウズするとGetが呼ばれますが、myapi/api/users/authenticate?username={0}&password={1}とすると、Get (NOT Authenticate) とエラーが発生します。
Navtrak.Services.WCF.NavtrakAPI.Controllers.UsersController' の 'System.String Get(Int32)' メソッドのパラメータ 'id' が NULL でない型 'System.Int32' のため、パラメータ辞書に null エントリが含まれています。オプションのパラメータは、参照型、NULL可能な型、またはオプションのパラメータとして宣言されている必要があります。
Authenticateのようなカスタムメソッド名を呼び出すにはどうしたらよいですか?
どのように解決するのですか?
デフォルトでは、ルート設定はRESTFulの規約に従っており、Get、Post、Put、Deleteのアクション名のみを受け付けます(global.asaxのルートを見てください => デフォルトではアクション名を指定できません => HTTP動詞を使用してディスパッチされます)。つまり、GET リクエストを
/api/users/authenticate
に GET リクエストを送ると、基本的に
Get(int id)
アクションを呼び出し
id=authenticate
を渡すと、Getアクションが整数を期待するため、明らかにクラッシュします。
もし標準的なものと異なるアクション名を持ちたいなら、ルート定義を
global.asax
:
Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "get", id = RouteParameter.Optional }
);
これで
/api/users/getauthenticate
に移動してユーザーを認証します。
関連
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] C#で同期メソッドから非同期メソッドを呼び出すには?
-
[解決済み] ASP.NET Web APIに整数の配列を渡しますか?
-
[解決済み] ASP.NET Web APIでエラーを返すためのベストプラクティス
-
[解決済み】ASP.NET Web APIのJWT認証について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] 2つのリストを結合する
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない