ASP.NET MVC HTTP Post/ Удалить
У меня есть приложение ASP.NET MVC. У меня есть один шаблон функции, который будет вызываться как с HTTP POST, так и с HTTP DELETE.
Хотя Post называется, Delete никогда не вызывается. Я подтвердил, что IIS принимает HTTP Delete. Любые комментарии?
Маршрут и контроллеры:
routes.MapHttpRoute(
name: "RegisterCard",
routeTemplate: "{version}/cards/{cardID}",
defaults: new { Controller = "MyController", Action = "
routes.MapHttpRoute(
name: "UnregisterCard",
routeTemplate: "{version}/cards/{cardID}",
defaults: new { Controller = "MyController", Action = "Delete" });
[HttpPost]
public async Task<HttpResponseMessage> Post(string version, string cardID);
{
}
[HttpDelete]
public async Task<HttpResponseMessage> Delete(string version, string cardID);
{
}
2 ответа
Из приведенного выше кода, я думаю, что любой URL с шаблоном {version}/cards/{cardID}
будет обрабатываться маршрутом "RegisterCard" независимо от того, что это за глагол (Post/Delete). Для "Удалить" будет выбран маршрут "RegisterCard", тогда, когда [HttpPost]
Селектор действий вступает в игру, это приведет к ошибке 404. Если вы видите 404 для "Удалить", вы можете
ONE Добавить ограничение на маршруты
routes.MapHttpRoute(
name: "RegisterCard",
routeTemplate: "{version}/cards/{cardID}",
defaults: new { Controller = "MyController", Action = "Post"},
constraints: new { httpMethod = new HttpMethodConstraint(new[] { "post" }) }
);
routes.MapHttpRoute(
name: "UnregisterCard",
routeTemplate: "{version}/cards/{cardID}",
defaults: new { Controller = "MyController", Action = "Delete" },
constraints: new { httpMethod = new HttpMethodConstraint(new[] { "delete" }) }
);
ИЛИ Составьте единый маршрут, объединяя их вместе с одним ActionName
routes.MapHttpRoute(
name: "Card",
routeTemplate: "{version}/cards/{cardID}",
defaults: new { Controller = "MyController", Action = "HandleCard"}
);
[ActionName("HandleCard")]
[HttpPost]
public async Task<HttpResponseMessage> Post(string version, string cardID);
{
}
[ActionName("HandleCard")]
[HttpDelete]
public async Task<HttpResponseMessage> Delete(string version, string cardID);
{
}
надеюсь это поможет.
Я не уверен, что HTTP поддерживает удаление. Независимо от этого, просто используйте сообщение для вашего действия удаления. Пока вы не используете GET для действия DELETE, все хорошо. Вот некоторая ссылка...