3

私はローカル Code Camp の講演をまとめており、ApiController の HTTP 動詞のニュアンスを理解しようとしています。Beta、RC、および最終リリースの間で ApiController に関するいくつかの点が大幅に変更されました。これを設定する方法についてのアドバイスは矛盾しており、場合によっては間違っています。

WebApiConfig の標準ルーティングを残していると仮定します。

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

(ここに {action} パラメータを追加すると、本当に物事を頭に入れることができるため)

次のような単純な Crud 呼び出しに対して規則がどのように機能しているかを理解しています。

    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }


    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

または、動詞名で始まる限り、これらを変更できます。

    // GET api/values/5
    public string GetMyStuff(int id)
    {
        return "value";
    }

ただし、最初の仕様では、ApiController は Get、Put、Post、および Delete をサポートすると述べています。それでも、次のメソッドを追加できます。

    public void HeadOfTheClass()
    {
    }

これは Head 動詞で機能しますが、あいまいな動詞または存在しない動詞のメソッドを追加することはできません。

    public void MKCOL()
    {
    }
    public void Bubba()
    {
    }

ネイティブの「サポートされている」動詞の完全なリストは?

ただし、AcceptVerb 属性を使用して、これらのメソッドのサポートを追加できます。

    [AcceptVerbs("MKCOL")] 
    public void MKCOL()
    {
    }
    [AcceptVerbs("Bubba")]
    public void Bubba()
    {
    }

これも機能します。または、「定義された」動詞には Http 属性を使用します。

    [HttpHead]
    public void HeadOfTheClass()
    {
    }

   [HttpGet]
    public void Bubba()
    {
    }

どちらが正しいか、または優先されますか? ([GET] や [POST] などの属性もありましたが、これらは非推奨ですか?)

[HttpBindNever] と [NonAction] は同等ですか?

4

1 に答える 1

8

私はオープンソースが大好きです。:)

ReflectedHttpActionDescriptor から:

private static readonly HttpMethod[] _supportedHttpMethodsByConvention = 
    { 
        HttpMethod.Get, 
        HttpMethod.Post, 
        HttpMethod.Put, 
        HttpMethod.Delete, 
        HttpMethod.Head, 
        HttpMethod.Options, 
        new HttpMethod("PATCH") 
    };
于 2012-11-28T00:32:22.400 に答える