Веб-API — поддерживаемые глаголы?

Я готовлю доклад для местного Code Camp и пытаюсь понять нюансы HTTP Verbs в ApiController. Несколько вещей в ApiController значительно изменились между бета-версией, RC и финальной версией, и советы о том, как вы можете настроить это, противоречивы, а иногда и неверны.

Предполагая, что я просто оставляю стандартную маршрутизацию в 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]?


person Jim    schedule 27.11.2012    source источник
comment
В SO лучше всего задавать только один вопрос за раз. Я ответил на, казалось бы, главный вопрос. Вероятно, будет лучше, если вы отредактируете этот вопрос и создадите из него 2 или 3 отдельных вопроса.   -  person ScottS    schedule 28.11.2012


Ответы (1)


Я люблю открытый исходный код. :)

Из дескриптора ReflectedHttpActionDescriptor:

private static readonly HttpMethod[] _supportedHttpMethodsByConvention = 
    { 
        HttpMethod.Get, 
        HttpMethod.Post, 
        HttpMethod.Put, 
        HttpMethod.Delete, 
        HttpMethod.Head, 
        HttpMethod.Options, 
        new HttpMethod("PATCH") 
    };
person ScottS    schedule 28.11.2012