Ваша карта маршрута, вероятно, примерно такая:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
Но чтобы иметь несколько действий с одним и тем же методом http, вам нужно предоставить webapi больше информации по маршруту, как показано ниже:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
Обратите внимание, что routeTemplate теперь включает в себя действие. Много дополнительной информации здесь: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Обновить:
Хорошо, теперь, когда я думаю, что я понимаю, что вы после здесь, еще один взгляд на это:
Возможно, вам не нужен параметр action url, и вы должны описать содержимое, которое вам нужно, другим способом. Поскольку вы говорите, что методы возвращают данные из одной и той же сущности, просто позвольте параметрам описать вас.
Например, ваши два метода могут быть превращены в:
public HttpResponseMessage Get()
{
return null;
}
public HttpResponseMessage Get(MyVm vm)
{
return null;
}
Какие данные вы передаете в объект MyVm? Если вы можете просто передавать переменные через URI, я бы предложил пойти по этому пути. В противном случае вам нужно будет отправить объект в теле запроса, и это не очень HTTP с вашей стороны при выполнении GET (хотя это работает, просто используйте [FromBody] перед MyVm).
Надеемся, что это показывает, что вы можете иметь несколько методов GET в одном контроллере, не используя имя действия или даже атрибут [HttpGet].
Обновление с веб-API 2.
С помощью этой конфигурации API в вашем файле WebApiConfig.cs:
Вы можете направить наш контроллер следующим образом:
Где ControllerName - это имя вашего контроллера (без «controller»). Это позволит вам получить каждое действие с маршрутом, описанным выше.
Для дальнейшего чтения: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
источник
В веб-API (по умолчанию) методы выбираются на основе комбинации метода HTTP и значений маршрута .
MyVm
выглядит как сложный объект, считываемый средством форматирования из тела, поэтому у вас есть два идентичных метода с точки зрения данных о маршруте (поскольку ни один из них не имеет параметров из маршрута) - что делает невозможным для диспетчера (IHttpActionSelector
) сопоставить соответствующий ,Вам необходимо различать их по строке запроса или параметру маршрута, чтобы устранить неоднозначность.
источник
После долгих поисков в Интернете и попыток найти наиболее подходящую форму для карты маршрутизации, если нашли следующее
Это отображение применяется как к отображению имени действия, так и к базовому соглашению http (GET, POST, PUT, DELETE)
источник
Возможно, ваши веб-методы разрешаются по одному и тому же URL. Посмотрите на следующую ссылку: -
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Таким образом, вам может потребоваться добавить имя вашего метода в таблицу маршрутизации.
источник
Без использования действий параметры будут:
переместите один из методов на другой контроллер, чтобы они не конфликтовали.
используйте только один метод, который принимает параметр, и, если он пуст, вызовите другой метод из вашего кода.
источник
Это решение сработало для меня.
Пожалуйста, сначала поместите Route2 в WebApiConfig. Также добавьте HttpGet и HttpPost перед каждым методом и включите имя контроллера и имя метода в URL.
WebApiConfig =>
Контроллер =>
URL =>
источник
Это ответ для всех, кто знает, что все правильно и проверил 50 раз .....
Убедитесь, что вы не смотрите повторно
RouteConfig.cs
.Файл, который вы хотите редактировать, называется
WebApiConfig.cs
Кроме того, это должно выглядеть примерно так:
Я мог бы спасти себя около 3 часов.
источник
Я обнаружил, что когда у меня есть два метода Get, один без параметров и один со сложным типом в качестве параметра, я получил ту же ошибку. Я решил эту проблему, добавив фиктивный параметр типа int с именем Id в качестве моего первого параметра, за которым последовал мой параметр сложного типа. Затем я добавил параметр сложного типа в шаблон маршрута. Следующее сработало для меня.
Сначала получите:
Второй получить:
WebApiConfig:
источник
Это возможно благодаря использованию контроллера MVC вместо контроллера Web API. Проверьте пространство имен в контроллере Web API, оно должно быть следующим
Если пространство имен выглядит следующим образом, то при вызове метода контроллера web api выдается ошибка выше.
источник
Пожалуйста, убедитесь, что у вас есть два метода с разными именами и параметрами.
Если это так, пожалуйста, удалите любой из методов и попробуйте.
источник
Я наткнулся на эту проблему, пытаясь дополнить свои контроллеры WebAPI дополнительными действиями.
Предположим, вы бы
Теперь есть два метода, которые удовлетворяют запросу на / api / controller, который вызывает проблему, описанную TS.
Я не хотел добавлять «фиктивные» параметры в мои дополнительные действия, поэтому я посмотрел на действия по умолчанию и придумал:
для первого метода в сочетании с «двойной» привязкой маршрута:
Обратите внимание, что, хотя в первом шаблоне маршрута нет параметра «action», очевидно, вы все равно можете настроить действие по умолчанию, позволяющее нам разделять маршрутизацию «обычных» вызовов WebAPI и вызовов на дополнительное действие.
источник
В моем случае все было правильно
1) Web Config был настроен правильно 2) Префикс маршрута и атрибуты маршрута были правильными
Тем не менее я получаю ошибку. В моем случае атрибут «Маршрут» (нажатием клавиши F12) указывал на System.Web.MVc, но не на System.Web.Http, который вызвал проблему.
источник
Вы можете добавить
[Route("api/[controller]/[action]")]
в свой класс контроллера.источник
Я знаю, что это старый вопрос, но иногда, когда вы используете сервисные ресурсы, такие как AngularJS, для подключения к WebAPI, убедитесь, что вы используете правильный маршрут, в противном случае возникает эта ошибка.
источник
Убедитесь, что вы НЕ украшаете ваши методы контроллера для действий GET | PUT | POST | DELETE по умолчанию с атрибутом [HttpPost / Put / Get / Delete]. Я добавил этот атрибут к своему действию контроллера Vanilla Post, и он вызвал 404.
Надеюсь, что это поможет кому-то, так как это может быть очень неприятно и привести к остановке прогресса.
источник
Например => TestController
Если вы можете изменить только файл WebApiConfig.cs.
Это оно :)
И результат:
источник
Вы пробовали как:
источник
HttpGet
атрибута нет конструктора, который принимает строковый аргумент.