Web api не поддерживает метод POST
В моем веб-контроллере api у меня есть функция со следующими кодами
[HttpPost]
public HttpResponseMessage Post(string schooltypeName)
{
_schoolTypeService.RegisterSchoolType(schooltypeName);
var message = Request.CreateResponse(HttpStatusCode.Created);
return message;
}
Когда я звоню с fiddler, я получаю эту ошибку
{"Message":"The requested resource does not support http method 'POST'."}
мои параметры прокрутки
Заголовок
User-Agent: Fiddler
Host: myhost:8823
Content-Type: application/json; charset=utf-8
Content-Length: 26
Тело запроса
{"schooltypeName":"Aided"}
Запрос URL-адреса
http://myhost:8823/SchoolType
(я настроил url, GET работает с этим URL-адресом)
Что здесь не так?
Ответы
Ответ 1
Измените действие как Post([FromBody]string schooltypeName)
, так как по умолчанию ожидается, что тип строки будет иметь Uri.
Обновление:
Измените свое тело на просто "Aided"
, так как в данный момент вам нужен класс, чтобы сделать операцию десериализации (например: class School { public string SchoolTypeName { get; set; } }
Ответ 2
См. раздел с использованием пространства имен в верхней части контроллера, если вы используете System.Web.Mvc, эта проблема может возникнуть:
Используйте это:
using System.Web.Http;
Ответ 3
Проблема сводится к следующему:
если ваши маршруты при запуске зарегистрированы с помощью routes.MapRoute(
вы должны украсить свои методы сообщений с помощью [System.Web.Mvc.HttpPost]
Если ваши маршруты при запуске зарегистрированы с помощью Routes.MapHttpRoute(
вы должны украсить свои методы сообщений с помощью [System.Web.Http.HttpPost]
если вы используете MapRoute()
с [System.Web.Http.HttpPost]
, он не будет работать
если вы используете MapHttpRoute()
с [System.Web.Mvc.HttpPost]
, он не будет работать
Ответ 4
Для будущих читателей. Я нашел этот вопрос.. но нашел (мой) ответ в другом месте.
Я украсил метод атрибутом, показанным ниже.
[System.Web.Http.HttpPost]
public MyOutputObject DoSomething([FromBody]MyInputObject args)
{
Console.Writeline(args.ToString());
}
Мой клиентский код (С#, консольное приложение) для полноты.
private static Task<MyOutputObject> MyClientCall(string baseAddress, MyInputObject args)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(baseAddress);
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
/* Your class name would be "MyEntityController" most likely */
string serviceUrl = baseAddress + @"api/MyEntity/DoSomething";
HttpResponseMessage response = client.PostAsJsonAsync(serviceUrl, args).Result;
Console.WriteLine(response);
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine("ERROR: :( " + response.ReasonPhrase);
return null;
}
Task<MyOutputObject> wrap = response.Content.ReadAsAsync<MyOutputObject>();
return wrap;
}
Я нашел свой ответ здесь:
http://blog.dontpaniclabs.com/post/2013/01/23/That-Pesky-Requested-Resource-Does-Not-Support-HTTP-Method-POST-Error-When-Using-MVC-Web-API
Ответ 5
Пожалуйста, проверьте название вашего метода GET Action, который вы используете. Скорее всего, вы используете одни и те же имена Route для метода GET и POST и ожидаете результата.
Пример:
Имя контроллера: StudentController
[Route("api/Student/names")]
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "student1", "student2" };
}
URL для метода (GET): http://localhost: 59342/api/student/names
[HttpPost]
[Route("api/Student/names")]
public String Post(String name)
{
return "success";
}
Для метода POST URL: http://localhost: 59342/api/student/names
Тогда вы получите вышеупомянутую ошибку
Решение: измените имя метода действия POST, как показано ниже
[HttpPost]
[Route("api/Student/getName")]
public String Post(String name)
{
return "success";
}
Тогда URL, который используется для получения ответа для метода post:
HTTP://локальный: 59342/API/студент/GetName
Ответ 6
В конце концов мне помогло добавление атрибута Route
и повторение там того же маршрута, который был зарегистрирован в глобальном масштабе.