Проблема с маршрутизацией WebApi - невозможно перенаправить на требуемое действие
Я использовал выбранный ответ отсюда: Маршрутизация на основе имени параметра строки запроса для построения моих маршрутов, но они не работают должным образом:
мой маршрут:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}",
defaults: new { controller = "Products" }
);
мои действия:
public string GetProductById(int id) {}
public string GetProductByIsbn(string isbn) {}
Я пытаюсь вызвать их через:
localhost:60819/api/products/id=33 //doesn't work
localhost:60819/api/products/33 //does work
а также
http://localhost:60819/api/products/isbn=9781408845240 //doesn't work
http://localhost:60819/api/products/testString //test with a definite string - doesn't work - still tries to use GetProductById(int id)
ошибка одинакова для обоих, которые не работают:
<Error><Message>The request is invalid.</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String GetProductById(Int32)' in 'BB_WebApi.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</MessageDetail>
</Error>
Кажется, что идентификатор не передается в...?
Я прочитал все документы MSDN, но мне кажется, что-то где-то не хватает. Кто-нибудь может увидеть, где я иду не так?
1 ответ
У вас есть несколько ошибок (и вы не показываете весь соответствующий код, или вы показываете неправильный код, как описано ниже, относящийся к id
в шаблоне маршрута).
localhost:60819/api/products/id=33 //doesn't work
Это никогда не сработает. Если вы хотите передать именованный параметр в URL, вы должны использовать строку запроса, т.е. вместо /id=33
нужно использовать ?id=33
localhost:60819/api/products/33 //does work
С маршрутом, который вы показываете, это не может работать. Вы можете передавать параметры как сегменты URL, только если вы определили эти параметры в своем шаблоне маршрута. Ваш шаблон маршрута должен выглядеть так: api/{controller}/{id}
таким образом id
может быть восстановлен из URL, и этот второй URL действительно работает.
http://localhost:60819/api/products/isbn=9781408845240
То же, что и второй. использование ?isbn=9781408845240
http://localhost:60819/api/products/testString
Это только карта testString
к параметру в шаблоне маршрута. Вам нужно что-то вроде этого: isbn=textString
чтобы иметь возможность вызвать действие, которое вас интересует.
Итак, запомните это:
- именованные параметры должны быть переданы в строке запроса url с использованием правильного синтаксиса строки запроса, а именно:
?param1=val1¶m2=val2
- Параметры сегмента URL должны присутствовать в шаблоне маршрута. Если нет, то переплетчик может что-то с ними сделать.
Похоже, что вам не хватает большого количества информации, пожалуйста, прочитайте эту документацию: Привязка параметров в ASP.NET Web API.
Это также может быть вам интересно: Маршрутизация атрибутов в ASP.NET Web API 2, которая позволяет использовать атрибуты маршрута, которые гораздо более гибки, чем шаблоны маршрутов.