Проблема с маршрутизацией 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&param2=val2
  • Параметры сегмента URL должны присутствовать в шаблоне маршрута. Если нет, то переплетчик может что-то с ними сделать.

Похоже, что вам не хватает большого количества информации, пожалуйста, прочитайте эту документацию: Привязка параметров в ASP.NET Web API.

Это также может быть вам интересно: Маршрутизация атрибутов в ASP.NET Web API 2, которая позволяет использовать атрибуты маршрута, которые гораздо более гибки, чем шаблоны маршрутов.

Другие вопросы по тегам