В Web API у меня был класс схожей структуры:
public class SomeController : ApiController
{
[WebGet(UriTemplate = "{itemSource}/Items")]
public SomeValue GetItems(CustomParam parameter) { ... }
[WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}
Поскольку мы могли отображать отдельные методы, было очень просто получить правильный запрос в нужном месте. Для аналогичного класса, который имел только один GET
метод, но также имел Object
параметр, я успешно использовал IActionValueBinder
. Однако в описанном выше случае я получаю следующую ошибку:
Multiple actions were found that match the request:
SomeValue GetItems(CustomParam parameter) on type SomeType
SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType
Я пытаюсь подойти к этой проблеме, переопределив ExecuteAsync
метод, ApiController
но пока безуспешно. Любой совет по этому вопросу?
Изменить: я забыл упомянуть, что сейчас я пытаюсь переместить этот код в ASP.NET Web API, который имеет другой подход к маршрутизации. Вопрос в том, как заставить код работать на ASP.NET Web API?
c#
asp.net-web-api
paulius_l
источник
источник
Ответы:
Это лучший способ, который я нашел для поддержки дополнительных методов GET и поддержки обычных методов REST. Добавьте следующие маршруты в ваш WebApiConfig:
Я проверил это решение с тестовым классом ниже. Мне удалось ударить каждый метод в моем контроллере ниже:
Я проверил, что он поддерживает следующие запросы:
Обратите внимание: если ваши дополнительные действия GET не начинаются с «Get», вы можете добавить в метод атрибут HttpGet.
источник
constraints: new{id=@"\d+"}
routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});
для моегоPut
метода, иначе он давал мне 404.Перейти от этого:
К этому:
Следовательно, теперь вы можете указать, какому действию (методу) вы хотите отправить свой HTTP-запрос.
публикация в "http: // localhost: 8383 / api / Command / PostCreateUser" вызывает:
и публикация в "http: // localhost: 8383 / api / Command / PostMakeBooking" вызывает:
Я попробовал это в приложении-сервисе WEB API, работающем самостоятельно, и оно работает как шарм :)
источник
[HttpGet]
,[HttpPost]
и т.д. атрибуты для отображения глагола метода.Я считаю, что атрибуты удобнее использовать, чем добавлять их вручную с помощью кода. Вот простой пример.
Вам также нужно это в вашем webapiconfig
Некоторые полезные ссылки http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api Этот лучше объясняет маршрутизацию. http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
источник
config.MapHttpAttributeRoutes();
к моемуWebApiConfig.cs
, иGlobalConfiguration.Configuration.EnsureInitialized();
в конце моегоWebApiApplication.Application_Start()
метода, чтобы заставить работать атрибуты маршрута.config.MapHttpAttributeRoutes();
должен появиться до отображения маршрута (например, доconfig.Routes.MappHttpRoute(...
.Вам нужно определить дальнейшие маршруты в global.asax.cs следующим образом:
источник
С более новым Web Api 2 стало проще иметь несколько методов get.
Если параметр, передаваемый в
GET
методы, достаточно отличается для системы маршрутизации атрибута, чтобы различать их типы, как в случае сint
s иGuid
s, вы можете указать ожидаемый тип в[Route...]
атрибутеНапример -
Подробнее об этом подходе см. Здесь http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/.
Другой вариант - дать
GET
методам разные маршруты.Смотрите здесь для получения более подробной информации - http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/
источник
В ASP.NET Core 2.0 вы можете добавить атрибут Route к контроллеру:
источник
Я пытался использовать маршрутизацию атрибутов Web Api 2, чтобы учесть несколько методов Get, и я включил полезные предложения из предыдущих ответов, но в Controller я только украсил «специальный» метод (пример):
... также не помещая [RoutePrefix] в верхней части контроллера:
Я получаю ошибки, утверждающие, что не найдено ни одного маршрута, соответствующего представленному URI. Как только у меня было [Route], украшающее метод, так и [RoutePrefix], украшающее Контроллер в целом, это работало.
источник
Я не уверен, что вы нашли ответ, но я сделал это, и это работает
Сейчас в global.asx
источник
Вы пытались переключиться на WebInvokeAttribute и установить метод для «GET»?
Я полагаю, что у меня была похожая проблема, и я переключился на явное указание, какой метод (GET / PUT / POST / DELETE) ожидается для большинства, если не для всех, моих методов.
WebGet должен справиться с этим, но я видел, что у него есть некоторые проблемы с множеством Get, намного меньше множественных Get с тем же типом возврата.
[Редактировать: все это недопустимо в случае заката WCF WebAPI и перехода на ASP.Net WebAPI в стеке MVC]
источник
источник
Альтернатива ленивых / спешащих (Dotnet Core 2.2):
Называя их :
"Hello42"
"World99"
источник
Ни один из приведенных выше примеров не помог мне. Ниже то, что я в итоге сделал.
Чтобы использовать вышеупомянутое в вашем маршруте, используйте:
То, что происходит, является методом подделок в методе, так что этот маршрут будет соответствовать только методам GET, POST, PUT и DELETE по умолчанию. Значение true говорит о том, что мы хотим проверить соответствие элементов в массиве. Если бы это было ложно, вы бы сказали исключить тех из str. Затем вы можете использовать маршруты выше этого метода по умолчанию, например:
В приведенном выше тексте он ищет следующий URL =>
http://www.domain.com/Account/Status/Active
или что-то в этом роде.Помимо вышесказанного, я не уверен, что стану слишком сумасшедшим. В конце дня это должно быть за ресурс. Но я вижу необходимость отображать дружественные ссылки по разным причинам. Я чувствую себя довольно уверенно, так как Web Api развивается, будет какое-то положение. Если будет время, я построю более постоянное решение и выложу.
источник
new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete)
вместо этого.Не удалось заставить работать ни одно из вышеперечисленных решений по маршрутизации - кажется, что некоторые синтаксис изменился, и я все еще новичок в MVC - в крайнем случае, хотя я собрал этот действительно ужасный (и простой) хак, который заставит меня на данный момент - обратите внимание, это заменяет метод "public MyObject GetMyObjects (long id)" - мы меняем тип "id" на строку и меняем тип возвращаемого значения на object.
источник
Если у вас есть несколько действий в одном файле, передайте один и тот же аргумент, например, Id для всех действий. Это потому, что действие только может идентифицировать Id, поэтому вместо присвоения имени аргументу только объявите Id следующим образом.
источник
Простая альтернатива
Просто используйте строку запроса.
Маршрутизация
контроллер
Запросы
Заметка
Имейте в виду, что параметр строки запроса не должен быть «id» или каким-либо другим параметром в настроенном маршруте.
источник
Измените WebApiConfig и добавьте в конце еще один Routes.MapHttpRoute следующим образом:
Затем создайте контроллер следующим образом:
Вот как я это решил. Надеюсь, это кому-нибудь поможет.
источник