2015-12-14 2 views
7

У меня есть ASP-контроллер asp.net с двумя методами GET. Один принимает строковый параметр, а другой принимает параметр int. У меня есть только маршрут по умолчанию, который устанавливается с помощью web api.У вас есть два метода GET с разными типами параметров в одном и том же сетевом контроллере api?

 public HttpResponseMessage GetSearchResults(string searchTerm) 
     { 
      HttpResponseMessage response; 
      //Do Work 
      return response; 
     } 

     public HttpResponseMessage Get(int id) 
     { 
      HttpResponseMessage response; 
      //Do Work 
      return response; 
     } 

Каждый раз, когда я передаю значение int в URL-адресе, вызывается метод GET, который принимает строковый параметр. Метод GET, который принимает параметр int, никогда не вызывается.

Возможно ли иметь два метода GET с разными типами параметров внутри одного и того же контроллера?

-Edit- Предлагаемый дублированный вопрос отличается тем, что он запрашивает около двух методов с одинаковыми параметрами - я спрашиваю о разных типах параметров.

ответ

14

Да, это возможно. Из коробки с конфигурацией по умолчанию то, что вы должны работать, предполагает, что вы передаете searchTerm в качестве параметра строки запроса. Однако, если вы пытаетесь передать его как часть URL-адреса, например, /api/myurl/blah, маршрутизация соглашения по умолчанию попытается сопоставить его с версией метода int и вернуть ошибку. Вам придется либо отредактировать конфигурацию по умолчанию, либо использовать Attribute Routing.

В общем, я считаю, что трассировка MVC, основанная на конгрессе, менее полезна в WebApi, поэтому я обычно отключил ее и использовал Attribute Routing.

Чтобы включить маршрутизацию атрибута, добавьте

config.MapHttpAttributeRoutes(); 

к вашему WebAPI конфигурации.

Затем вы можете пометить свои методы как таковые

[HttpGet] 
[Route("api/myobject/")] 
public HttpResponseMessage GetSearchResults(string searchTerm) 
{ 
    HttpResponseMessage response; 
    //Do Work 
    return response; 
} 

[HttpGet] 
[Route("api/myobject/{id:int}")] 
public HttpResponseMessage Get(int id) 
{ 
    HttpResponseMessage response; 
    //Do Work 
    return response; 
} 

Теперь вы можете вызвать первый метод с помощью

/api/myobject?searchTerm=blah 

, а второй через

/api/myobject/1 

и они не должны Не сталкивайтесь.

Однако, если вы хотите иметь searchTerm быть в URL вместо параметров запроса, вы можете изменить маршрут

[Route("api/myobject/{searchTerm}")] 

The api/myobject/{id:int} маршрут будет ловить все идентификаторы и api/myobject/{searchTerm} поймает большинство что-нибудь еще. Однако будьте осторожны с этим, как если бы URL-адрес не был закодирован в URL, странные вещи будут иметь тенденцию происходить.

Я не знаю точно, какое форматирование URL вы ищете, поэтому я представил простые примеры. link, который я опубликовал ранее, углубляется в маршрутизацию атрибутов. Это позволяет вам выполнять более сложные маршруты, чем маршрутизацию по соглашению, которое WebApi унаследовано от MVC.

+0

Отличное объяснение - приписанная маршрутизация работала отлично! – Aaron

+0

Нет проблем. Рад, что это помогло. –

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