2014-01-06 3 views
2

Я работаю с проектом ASP.Net Web Api на Web Developer Express 2010. Конфигурационный маршрутизации определяется в WebApiConfig.cs как:ASP.Net Web Api маршрутизации проблема с ActionName

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

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

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

АНИ контроллер называется «GCURObservationController» имеет действие, как:

[HttpGet, ActionName("retrieveCuringMaps")] 
    public IList<SimpleCuringMapsModel> retrieveCuringMaps() 
    { 
     ... ... 
     return jsonCuringMapModels; 
    } 

проект был составлен и успешно работать. Тем не менее, я должен был пойти в

http://localhost:2061/api/GCURObservation/retrieveCuringMaps/0 

, чтобы получить действие срабатывающие (имя действия следует любое целое число), а не то, что я ожидал

http://localhost:2061/api/GCURObservation/retrieveCuringMaps 

Это означает, что любое целое число было следовать название действия, чтобы понять это правильно. В противном случае ошибка была возвращена. Я не хочу, чтобы это действие запускалось с любым параметром.

{"Message":"The request is invalid."} 

Как получить второй URL для работы? Благодаря

Cheers, Alex

+1

маршрутизация работает через проваливаются (думайте о нем, как случай, когда он падает, пока она не соответствует), так что порядок маршрутов много вопросов. Я думаю, вы можете исправить это, заменив 'DefaultApi3' и' DefaultApi4', или изменив свое действие на 'retrieveCuringMaps (int id = 0)' –

+0

Спасибо Siva. Тем не менее, он по-прежнему дал ту же ошибку после того, как я заменил DefaultApi3 и DefaultApi4. – alextc

+1

Просто из любопытства, что происходит, когда вы удаляете маршрут «DefaultApi»? Это кажется принципиально ошибочным, поскольку у вас нет маршрута без действия. –

ответ

2

Если вы используете Web API 2, следующие одно решение, которое вы могли бы использовать. В приведенном ниже примере я использую маршрутизацию атрибутов и обычную маршрутизацию вместе в одном контроллере. Здесь все действия, кроме GetCustomerOrders, достигаются с помощью обычного маршрута «DefaultApi».

В целом идея здесь не нова, то есть ... даже без маршрутизации атрибутов веб-API 2, вы можете определять маршруты для каждого отдельного действия контроллера в глобальной таблице маршрутов, но маршрутизация атрибутов облегчает этот процесс так как вы можете определять маршруты непосредственно и близко к действию.

config.MapHttpAttributeRoutes(); 

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

[RoutePrefix("api/customers")] 
public class CustomersController : ApiController 
{ 
    public IEnumerable<Customer> GetAll() 
    { 
    } 

    public Customer GetSingle(int id) 
    { 
    } 

    public void Post(Customer customer) 
    { 
    } 

    public void Put(int id, Customer updatedCustomer) 
    { 
    } 

    public void Delete(int id) 
    { 
    } 

    [Route("{id}/orders")] 
    public IEnumerable<Order> GetCustomerOrders(int id) 
    { 
    } 
} 
Смежные вопросы