2013-11-01 3 views
6

Я создал шаблон маршрута:Wildcard в WebAPI Route шаблон

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

действия подписи контроллера:

public IEnumerable<object> Get(Int64 id,string abc) 

Я пытался сравнить его с URL http://mymachine.com/api/Individuals/1?abc=4, но это дает мне исключение

{"$ id": "1", "Message": "Ошибка имеет .", "ExceptionMessage": "Ссылка на объект не s и др к экземпляру из объекта с "" ExceptionType. ":" System.NullReferenceException " "StackTrace":" на System.Web.Http.ValueProviders.Providers.RouteDataValueProvider.d__4.MoveNext() \ г \ n

Странно, http://mymachine.com/api/Individuals?id=1&abc=4 действительно соответствует контроллеру, действию и параметрам.

Я думал, "{ID}" из "API/{контроллер}/{ID}/{символ *}" будет работать.

Почему?

+0

You cant имеет необязательный параметр, а не необязательный! Кроме того, если вы передаете строку abc в качестве строки запроса, вам не нужно иметь ее на маршруте! Я бы переделал свой маршрут, если бы был на вашем месте ... подумать –

ответ

7

Подстановочный знак подскажет, что механизм маршрутизации соответствует остальной части URI параметру маршрута (например, см. Раздел «Получить книги по дате публикации» раздел in this article).

Это не означает, что любой произвольный именованный параметр соответствует любому параметру - это то, что WebApi по умолчанию имеет элементы в querystring независимо от конфигурации вашего маршрута (следовательно, почему вы выполняли второй URI - он не соответствовал никакому маршруту) ,

Это не соответствует {id} в вашем маршруте, так как он ожидал, что параметр {wildcard} не был помечен как дополнительный.

Для иллюстрации, если вы просто изменили 'символ' на 'ABC':

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

Тогда это будет успешно соответствовать следующим URI:

http://mymachine.com/api/Individual/1/a/b/c

Со значениями id=1, abc=a/b/c

Чтобы исправить, просто удалите шаблон с вашего маршрута, чтобы он выглядел так:

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

Ответ от gooid правильный. Я просто хочу ответить на 2-ю часть вопроса:

Странно, http://mymachine.com/api/Individuals?id=1&abc=4 действительно соответствует контроллеру, действию и параметрам.

Поскольку у вас есть ID = RouteParameter.Optional, если маршрут не предоставляет идентификатор, он все еще матчи шаблон маршрута. Заполнитель {* wildcard} ищет остальную часть маршрута и помещает его в словарь маршрута под ключом «подстановочный знак». В этом случае это пустая строка (или null).

Помните, что параметры запроса также входят в словарь маршрутов. Таким образом, ваш маршрут Словарь будет: { "ID": "1", "ABC": "4", "групповой символ": ""}

Для получения дополнительной информации, вы можете посмотреть в http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

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