Я начинаю использовать проект MVC4 Web API, у меня есть контроллер с несколькими HttpPost
методами. Контроллер выглядит следующим образом:
контроллер
public class VTRoutingController : ApiController
{
[HttpPost]
public MyResult Route(MyRequestTemplate routingRequestTemplate)
{
return null;
}
[HttpPost]
public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
{
return null;
}
}
Здесь MyRequestTemplate
представлен шаблонный класс, отвечающий за обработку Json, приходящего через запрос.
Ошибка:
Когда я делаю запрос с помощью Fiddler for http://localhost:52370/api/VTRouting/TSPRoute
или http://localhost:52370/api/VTRouting/Route
получаю сообщение об ошибке:
Найдено несколько действий, соответствующих запросу
Если я удалю один из вышеуказанных методов, он будет работать нормально.
Global.asax
Я попытался изменить таблицу маршрутизации по умолчанию global.asax
, но все еще получаю сообщение об ошибке. Думаю, у меня проблема с определением маршрутов в global.asax. Вот что я делаю в global.asax.
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "MyTSPRoute",
routeTemplate: "api/VTRouting/TSPRoute",
defaults: new { }
);
routes.MapHttpRoute(
name: "MyRoute",
routeTemplate: "api/VTRouting/Route",
defaults: new { action="Route" }
);
}
Я делаю запрос в Fiddler с помощью POST, передавая json в RequestBody для MyRequestTemplate.
Гораздо лучшим решением вашей проблемы было бы использование,
Route
которое позволяет вам указать маршрут в методе с помощью аннотации:источник
Route
иTSPRoute
?использовать:
это больше не подход RESTful, но теперь вы можете вызывать свои действия по имени (вместо того, чтобы позволить веб-API автоматически определять одно для вас на основе глагола), например:
Вопреки распространенному мнению, в этом подходе нет ничего плохого, и он не злоупотребляет веб-API. Вы по-прежнему можете использовать все замечательные функции веб-API (делегирование обработчиков, согласование содержимого, форматирование mediatype и т. Д.) - вы просто отказываетесь от подхода RESTful.
источник
Конечная точка веб-API (контроллер) - это единственный ресурс, который принимает команды get / post / put / delete. Это не обычный контроллер MVC.
Обязательно при
/api/VTRouting
может быть только один метод HttpPost, принимающий отправляемые вами параметры. Имя функции не имеет значения , если вы украшаете его содержимым [http]. Но я никогда не пробовал.Изменить: это не работает. При разрешении это похоже на количество параметров, а не на попытку привязки модели к типу.
Вы можете перегрузить функции, чтобы они принимали другие параметры. Я почти уверен, что все будет в порядке, если вы объявите это так, как вы делаете, но использовали бы другие (несовместимые) параметры для методов. Если параметры совпадают, вам не повезло, поскольку привязка модели не будет знать, какой из них вы имели в виду.
Эта часть работает
Шаблон по умолчанию, который они предоставляют, когда вы создаете новый, делает это довольно явным, и я бы сказал, что вы должны придерживаться этого соглашения:
Если вы хотите создать один класс, который выполняет множество функций, для использования ajax нет большой причины не использовать стандартный шаблон контроллер / действие. Единственная реальная разница в том, что сигнатуры ваших методов не такие красивые, и вам нужно обернуть все,
Json( returnValue)
прежде чем возвращать их.Редактировать:
Перегрузка отлично работает при использовании стандартного шаблона (отредактированного для включения) при использовании простых типов. Я пошел и протестировал и другой способ, с двумя пользовательскими объектами с разными подписями. Никогда не мог заставить его работать.
В данном случае это сработало для меня, посмотрим, к чему это приведет. Исключение только для тестирования.
И вызывается так из консоли:
источник
В один контроллер веб-API можно добавить несколько методов Get и Post. Здесь маршрут по умолчанию вызывает проблему. Веб-API проверяет соответствие маршрута сверху вниз и, следовательно, соответствие вашего маршрута по умолчанию для всех запросов. В соответствии с маршрутом по умолчанию в одном контроллере возможен только один метод Get и Post. Либо поместите следующий код сверху, либо закомментируйте / удалите маршрут по умолчанию
источник
Поместите префикс маршрута [RoutePrefix ("api / Profiles")] на уровне контроллера и поместите маршрут в метод действия [Route ("LikeProfile")]. Не нужно ничего менять в файле global.asax
источник
Думаю, на вопрос уже дан ответ. Я также искал что-то контроллер webApi, который имеет такие же подписанные методы, но разные имена. Я пытался реализовать Калькулятор как WebApi. В калькуляторе есть 4 метода с одинаковой сигнатурой, но разными именами.
и в файле WebApiConfig у вас уже есть
Просто установите аутентификацию / авторизацию в IIS, и все готово!
Надеюсь это поможет!
источник
Вы можете использовать такой подход:
источник
Я не уверен, нарушает ли перегрузка метода get / post концепцию restfull api, но он работает. Если бы кто-нибудь мог просветить по этому поводу. Что делать, если у меня есть uri как
так что, как вы могли видеть, мой журнал является своего рода aggregateroot, хотя я могу определить другой контроллер для публикации исключительно и передать идентификатор публикации в моем URL-адресе, однако это дает гораздо больше смысла. поскольку моей публикации не было бы без самого журнала.
источник
Я просто добавил «action = action_name» к URL-адресу, и таким образом механизм маршрутизации знает, какое действие я хочу. Я также добавил к действиям атрибут ActionName, но не уверен, что он нужен.
источник
Лучшее и простейшее объяснение, которое я видел по этой теме - http://www.binaryintellect.net/articles/9db02aa1-c193-421e-94d0-926e440ed297.aspx
Я получил его, работающий только с Route, и мне не нужен RoutePrefix.
Например, в контроллере
и
Затем имя функции входит в jquery как -
или
источник