2013-08-05 4 views
0

Это сводит меня с ума. Это мой контроллер действия:Не понимая правильного пути маршрута моего действия

[HttpGet] 
public List<Product> RetrieveByIds(int[] ids) 
{ 
    Product p = new Product(); 
    //return p.RetrieveByIds(ids); 
    return new List<Product>(); 
} 

Это мой файл маршрутизации:

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

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

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

И я получаю эту ошибку, когда я пытаюсь проверить его с помощью RestConsole:

{ 
"Message": "The request is invalid.", 
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Collections.Generic.List`1[GrownHome.Web.Models.Product] RetrieveAllByUserId(Int32)' in 'GrownHome.Web.Controllers.Api.ProductController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter." 
} 

I продолжайте играть на моем экране, играя с кодом, и я никуда не уйду. Мне не нужно объяснять вам, ребята, как это расстраивает :)))

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

Спасибо!

ответ

0

Рамка пытается сопоставить URL-адрес маршрута в соответствии с порядком маршрута, указанным в вашем методе Register, поэтому ваш третий маршрут фактически никогда не будет использоваться, потому что первые два маршрута являются стандартными маршрутами «поймать все» , Вот почему вы получаете сообщение об ошибке, указывающее, что параметр id имеет значение NULL.

Общее эмпирическое правило заключается в размещении более конкретных маршрутов перед более общими маршрутами, чтобы гарантировать, что структура маршрутизации правильно соответствует URL-адресу маршрута. Таким образом, в вашем случае ваш маршрут должен быть перемещен впереди двух маршрутов по умолчанию:

public static void Register(HttpConfiguration config) 
{ 

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

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

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

Обратите внимание, что третий в вашей настройке никогда не пострадает. Решение было бы иметь ограничения или использовать один и тот же маршрут для обоих. Кроме того, он не попадает во второй, если добавляется идентификатор, поскольку это было бы уловлено {действием} в предыдущем (идентификаторы заданы как необязательные). – JuhaKangas

0

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

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