web-dev-qa-db-ja.com

アクション名へのWeb APIルート

JavaScriptで使用されるJSONを返すためのコントローラーが必要なので、ApiControllerクラスから継承しましたが、期待どおりに動作しません。 Apress book Pro ASP.NET MVC 4および私が見つけたほとんどのオンライン例では、次のような例を示しています。

public class ServicesController : ApiController
{
    public string[] MethodFruit()
    {
        return new string[] { "Apple", "Orange", "Banana" };
}

uRLからアクセス:

http://mysite/services/methodfruit

しかし、それは決して機能しません-リソースが見つかりません。私が働くことができる唯一のアプローチは、コントローラーに各HTTP動詞の異なるメソッドを含めることです:

http://mysite/api/services

GETメソッドを呼び出します。

ApressのWebサイトをチェックしましたが、フォーラムはないようです。現在のソースコードは、私が使用していないVS 2012にあります。私はソースファイルを調べましたが、彼らは前者のアプローチがうまくいくと思うようです。前者のアプローチはサポートされなくなりましたか?

13
David

うん...一般的には、ASP.NET WEB APIで期待されるデフォルトの命名規則に従う必要があります。

この公式ドキュメントを確認してください:

ASP.NET Web APIでのルーティング

規則に従わない場合は、上記のリンクされたドキュメントで説明されているアクション名によるルーティングセクションを試すことができます。

アクション名によるルーティング

デフォルトのルーティングテンプレートでは、Web APIはHTTPメソッドを使用してアクションを選択します。ただし、アクション名がURIに含まれるルートを作成することもできます。

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );

あなたの場合、これをする必要があります:

[HttpGet]
public string[] MethodFruit()
{
    return new string[] { "Apple", "Orange", "Banana" };
}
29

ルーティング時にWeb APIがアクション名を検索するようにするには、App_StartフォルダーのWebApiConfig.csクラスを次のように変更します。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

次に、GETリクエストを行うことができます

http://mysite/api/Services/MethodFruit
7
Mahesh

上記の回答に関する追加情報を追加します。 RoutePrefixを追加すると、問題が解決する場合があります。それが役に立てば幸い

コントローラ

    [RoutePrefix("api/Services")]
    public class ServicesController : ApiController
    {
        [System.Web.Http.AcceptVerbs("GET", "POST")]
        [System.Web.Http.HttpGet]
        [Route("MethodFruit")]
        public string[] MethodFruit()
        {
            return new string[] { "Apple", "Orange", "Banana" };
        }
    }

構成内

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );
5
Praveen M P

私は同じ問題に直面していました、私のコードでそれを見つけました

using System.Web.Mvc; 

system.Web.Httpを使用するMvc inteadをインポートしました。そのため、webApiルートではなくMvcルーティングを使用していました。私はそれを置き換えました

using System.Web.Http 

そしてそれは私のために働く。初心者が同じ間違いを繰り返さないように、答えを追加しています

0
Uttam Ughareja