Подтвердить что ты не робот

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-адресом)

Что здесь не так?

4b9b3361

Ответ 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 и повторение там того же маршрута, который был зарегистрирован в глобальном масштабе.