ASP.NET Web API の複数の GET メソッドを持つ単一のコントローラー 質問する

ASP.NET Web API の複数の GET メソッドを持つ単一のコントローラー 質問する

Web API には、同様の構造のクラスがありました。

public class SomeController : ApiController
{
    [WebGet(UriTemplate = "{itemSource}/Items")]
    public SomeValue GetItems(CustomParam parameter) { ... }

    [WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

個々のメソッドをマップできるため、適切な場所で適切なリクエストを取得するのは非常に簡単でした。GETメソッドが 1 つしかないがObjectパラメーターも持つ同様のクラスの場合、 を使用できましたIActionValueBinder。ただし、上記のケースでは次のエラーが発生します。

Multiple actions were found that match the request: 

SomeValue GetItems(CustomParam parameter) on type SomeType

SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType

ExecuteAsyncこの問題に対処するために、メソッドをオーバーライドしようとしていますApiControllerが、今のところうまくいきません。この問題について何かアドバイスはありますか?

編集: 言及するのを忘れていましたが、現在、このコードをルーティングに対する異なるアプローチを持つ ASP.NET Web API に移動しようとしています。問題は、このコードを ASP.NET Web API で動作させるにはどうすればよいかということです。

ベストアンサー1

これは、追加の GET メソッドをサポートし、通常の REST メソッドもサポートするために私が見つけた最良の方法です。次のルートを WebApiConfig に追加します。

routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");
routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new {action = "Post"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Post)});

以下のテスト クラスでこのソリューションを検証しました。以下のコントローラーの各メソッドを正常に実行できました。

public class TestController : ApiController
{
    public string Get()
    {
        return string.Empty;
    }

    public string Get(int id)
    {
        return string.Empty;
    }

    public string GetAll()
    {
        return string.Empty;
    }

    public void Post([FromBody]string value)
    {
    }

    public void Put(int id, [FromBody]string value)
    {
    }

    public void Delete(int id)
    {
    }
}

以下のリクエストをサポートしていることを確認しました。

GET /Test
GET /Test/1
GET /Test/GetAll
POST /Test
PUT /Test/1
DELETE /Test/1

注記追加の GET アクションが「Get」で始まらない場合は、メソッドに HttpGet 属性を追加することをお勧めします。

おすすめ記事