2016-05-25 2 views
3

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

Например:

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 и конфигурацией маршрутизации, но ничего не работало.

Благодаря

+1

Если все они делают то же самое, я предлагаю создать пользовательский класс (объект) для хранения каждого из них (обнуляемых) свойств, и с использованием 1 маршрута. –

ответ

6

Вы можете использовать attribute routing для этого. Например:

[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 
+1

Действительно ли это действительный случай: * api/MyController/"abc" * ?? – SamGhatak

+0

Вам не нужно вставлять строку в кавычки – Nasreddine

+1

да, поэтому я смущен, кажется, что OP хочет отличить 'string' и' int' от * api/MyController/"1" * и * api/MyController/1 * .... – SamGhatak

3

Вы должны предоставить 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) {..} 

} 

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

0

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

пример:

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

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

Не измените ли это URL? –

+0

Да, однако это не изменит имя метода. –

+1

Что случилось с косой чертой в конце маршрута? –

Смежные вопросы