Тот же url для перегруженных методов контроллера



В моем приложении web api я хочу, чтобы клиенты могли делать запросы, используя тот же путь, но передавая другой тип параметров.



Например:



public class MyController : ApiController
{
[HttpDelete]
public IHttpActionResult Delete(int id) {..}

[HttpDelete]
public IHttpActionResult Delete2(Guid id) {..}

[HttpDelete]
public IHttpActionResult Delete3(string id) {..}

}


Я хочу, чтобы url-адрес для каждого метода был похож, например:



api/MyController/1
api/MyController/abc etc..


Возможно ли это? Iv'e перепробовал множество комбинаций с атрибутом ActionName и конфигурацией маршрутизации, но ничего не сработало.



Спасибо

496   3  

3 ответов:

Для этого можно использовать атрибутивную маршрутизацию. Например:

[RoutePrefix("MyController")]
public class MyController : ApiController
{
   [HttpDelete]
   [Route("delete/{id:int}")]
   public IHttpActionResult Delete(int id) {..}

   [HttpDelete]
   [Route("delete/{id:guid}")]
   public IHttpActionResult Delete2(Guid id) {..}

   [HttpDelete]
   [Route("delete/{id:alpha}")]
   public IHttpActionResult       Delete3(string id) {..}

}

Если вы сделаете это, то url запроса будет:

http://yoursever/mycontroller/delete/123
http://yoursever/mycontroller/delete/abc
http://yoursever/mycontroller/delete/91c74f8f-d981-4ee1-ba36-3e9416bba202

Вам нужно предоставить Route с различными типами параметров для каждого из ваших методов:

[RoutePrefix("api/MyController")]
public class MyController : ApiController
{
   [HttpDelete]
   [Route("{id:int}", Order = 1)]
   public IHttpActionResult Delete(int id) {..}

   [HttpDelete]
   [Route("{id:guid}", Order = 2)]
   public IHttpActionResult Delete2(Guid id) {..}

   [HttpDelete]
   [Route("{id}", Order = 3)]
   public IHttpActionResult Delete3(string id) {..}

}

Конечно, вы должнывключить маршрутизацию атрибутов , Если вы этого еще не сделали.
Свойство Order для атрибута Route гарантирует, что шаблоны маршрутов проверяются в правильном порядке, так что значение int не будет соответствовать строковому маршруту.

Да, это возможно. Попробуйте задать маршрут в виде decoration.

Пример:

        [Route("DeleteThis/{id}")]
        [HttpDelete]
        public IHttpActionResult DeleteThis(int id)
        {
            return Ok();
        }

        [Route("NowDeleteThis/{name}")]
        [HttpDelete]
        public IHttpActionResult DeleteThis(string name)
        {
            return Ok();
        }

Comments

    Ничего не найдено.