2014-02-13 4 views
11

Вот моя конфигурация маршрутизации:asp.net маршрутизации Web Api не работает

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

И вот мой контроллер:

public class ProductsController : ApiController 
{ 
    [AcceptVerbs("Get")] 
    public object GetProducts() 
    { 
     // return all products... 
    } 

    [AcceptVerbs("Get")] 
    public object Product(string name) 
    { 
     // return the Product with the given name... 
    } 
} 

Когда я пытаюсь api/Products/GetProducts/, это работает. api/Products/Product?name=test также работает, но api/Products/Product/test не работает. Что я делаю не так?

UPDATE:

Вот что я получаю, когда я пытаюсь api/Products/Product/test:

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:42676/api/Products/Product/test'.", 
    "MessageDetail": "No action was found on the controller 'Products' that matches the request." 
} 

ответ

15

Это связано с настройками маршрутизации и его значениями по умолчанию. У вас есть два варианта.

1) Изменив настройки маршрута в соответствии с параметром Product() в соответствии с URI.

config.Routes.MapHttpRoute(
    name: "ActionApi", 
    routeTemplate: "api/{controller}/{action}/{name}", // removed id and used name 
    defaults: new { name = RouteParameter.Optional } 
); 

2) Другой и рекомендуемый способ - использовать правильный атрибут подписи метода.

public object Product([FromUri(Name = "id")]string name){ 
     // return the Product with the given name 
} 

Это происходит потому, что метод ожидает параметр идентификатор при запросе API/Продукты/Продукт/тест, а не ищет имя параметра.

+0

Я пробовал '[FromUri]', но это не сработало. – ataravati

+1

ОК, похоже, вам нужно указать имя, например: 'public object Product ([FromUri (Name =" id ")] string name)'. – ataravati

+0

Спасибо за рекомендуемый способ! – ataravati

7

На основе вашего обновления:

Пожалуйста, обратите внимание, что WebAPI работы, основанные на отражении этого означает, что ваши фигурные скобки {vars} должны совпадать с тем же именем в ваших методах.

Поэтому, чтобы соответствовать этому api/Products/Product/test на основе этого шаблона "api/{controller}/{action}/{id}" ваш метод должен быть объявить так:

[ActionName("Product")] 
[HttpGet] 
public object Product(string id){ 
    return id; 
} 

В случае, если параметр string name был заменен string id.

Вот мой полный пример:

public class ProductsController : ApiController 
{ 
    [ActionName("GetProducts")] 
    [HttpGet] 
    public object GetProducts() 
    { 
     return "GetProducts"; 
    } 
    [ActionName("Product")] 
    [HttpGet] 
    public object Product(string id) 
    { 
     return id; 
    } 
} 

Я попытался с помощью совершенно другого шаблона:

config.Routes.MapHttpRoute(
       name: "test", 
       routeTemplate: "v2/{controller}/{action}/{id}", 
       defaults: new { id = RouteParameter.Optional, demo = RouteParameter.Optional } 
      ); 

Но он работал отлично на моем конце. Btw I дополнительно удалено [AcceptVerbs("Get")] и заменено их [HttpGet]

+0

Я сделал это.Все еще не работает. – ataravati

+0

@ataravati отлично работает на моем конце. Вы получаете сообщение об ошибке? – Dalorzo

+0

Спасибо за объяснение! Я изменил имя параметра, и он сработал. – ataravati

1

Ваш маршрут определяет идентификатор в качестве параметра, но ваш метод ожидает параметр имени. Я предпочитаю маршрутизацию атрибутов, если вы можете, затем определите/api/products/product/{name} в методе Product.

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

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