Как использовать маршрутизацию атрибутов веб-API ASP.NET с параметром сложного объекта?

У меня есть действие веб-API, которое выглядит следующим образом:

[HttpGet]
[Route("api/query/hello/{query}")]
public HttpResponseMessage Hello([FromUri]Query query)
{
    return null;
}

где у класса Query есть общедоступное строковое свойство с именем QueryText. Когда я нажимаю следующий URL, я получаю ошибку 404:

/api/query/hello?QueryText=bacon

Это работало до того, как я начал использовать маршрутизацию атрибутов. Если у меня нет параметров или параметров примитивного типа, я могу заставить работать маршрутизацию атрибутов. Но со сложным параметром я получаю 404. Как атрибутная маршрутизация работает со сложными параметрами действий? Совместимо ли это с атрибутом FromUri?


person user2719100    schedule 17.01.2014    source источник
comment
Я не могу воспроизвести ваш сценарий ... не могли бы вы рассказать, как выглядит ваша конфигурация маршрута? ... в частности, содержимое в WebApiConfig.cs   -  person Kiran Challa    schedule 18.01.2014
comment
@KiranChalla Думаю, я случайно решил свою проблему. Я опечатал образец кода. Я отредактировал свой вопрос, чтобы он отражал исходный код, который я использовал. Обратите внимание на токен {query} в шаблоне маршрута. Если я удалю этот токен, я считаю, что он будет работать так, как требовалось.   -  person user2719100    schedule 18.01.2014
comment
@ user2719100 Не могли бы вы прояснить путаницу, пожалуйста - то есть добавьте ответ, объясняющий возникшую у вас проблему, и отметьте его как ответ? TIA :)   -  person Alex Angas    schedule 18.03.2014


Ответы (2)


Решением здесь было то, что токен {query} в определении маршрута был лишним. Удаление, как показано ниже, устранило проблему:

[Route("api/query/hello")]
person user2719100    schedule 18.03.2014
comment
Чувак, я так хотел бы получить +5! Боролся с этим в течение 30 минут в пятницу вечером! Спасибо! - person Sudhanshu Mishra; 26.08.2016
comment
Как это изменится для http-сообщения с параметрами в кодировке url? - person Zapnologica; 07.01.2018

Атрибут [FromUri] потребуется, поскольку вы читаете URL-адрес. Ваш маршрут должен выглядеть примерно так:

public HttpResponseMessage Hello([FromUri]Query query)
{
    //Implement whatever
    return null;
}

/ api / {имя контроллера} / hello? QueryText = bacon

Тогда должно работать правильно.

Связыватель модели примет любые параметры запроса, которые вы указали, а затем попытается связать все, что находится внутри этого Query объекта. Я бы побеспокоился об атрибуте маршрута после того, как он сначала заработает.

person Jon Douglas    schedule 17.01.2014
comment
Я упростил пример, чтобы лучше понять проблему. Фактический класс параметров содержит гораздо больше, чем одно строковое свойство :) - person user2719100; 18.01.2014