УДАЛИТЬ http://localhost: 54178 / API / сотрудников 405 (метод не допускается) - PullRequest
0 голосов
/ 17 января 2020

Я использую React Client с C# WEB API.

Функция REACT

 const deleteThisEmployee = empId => {
    const formData = new FormData();
    formData.append("id", empId);
    fetch("http://localhost:54178/api/employee", {
      method: "DELETE",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json"
      },
      body: formData
    })
      .then(resp => resp.json())
      .then(
        result => {
          // SUCCESS
        }
        // FAIL
      );
  };

Настройки веб-API:

   public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {          
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // add this to support JSON response and not XML
            config.Formatters.JsonFormatter.SupportedMediaTypes
                .Add(new MediaTypeHeaderValue("text/html"));

            // Enable Cors

            config.EnableCors(new EnableCorsAttribute("http://localhost:3000", "*", "*"));  // React
        }
    }

И Контроллер:

public class EmployeeController : ApiController
{
    // .. Some other verbs

    public String Delete(int id)
    {
        // TODO
        Console.WriteLine("Got the Employee ID : " + id);

        // Continue with delete logic 
    }

}

Когда я пытаюсь удалить строку, я получаю

DELETE http://localhost:54178/api/employee 405 (Method Not Allowed)

Я проверил некоторые вопросы по SO, которые предлагали добавить в WEB.Config

  <remove name="WebDAV" />
  <remove name="WebDAVModule" />

Но это не помогло.

Есть идеи, что может вызвать это?

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Это может быть одна (или обе) из нескольких вещей.

  1. Маршрут не регистрируется как DELETE автоматически. Вы можете исправить это, добавив [HttpDelete] над действием Delete.
  2. Он не ищет id в теле. DELETE метод может содержать тело , согласно спецификациям, но это не означает, что ASP. NET поддерживает его. (Я не могу вспомнить, если это так или нет) Вы можете попробовать передать его через URL, а не в теле:
 const deleteThisEmployee = empId => {
    fetch("http://localhost:54178/api/employee?id=" + empId, {
      method: "DELETE",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json"
      }
    })
      .then(resp => resp.json())
      .then(
        result => {
          // SUCCESS
        }
        // FAIL
      );
  };
1 голос
/ 17 января 2020

Вы должны указать платформе искать метод удаления с атрибутом глагола действия на контроллере следующим образом:

public class EmployeeController : ApiController
{
    // .. Some other verbs


    [HttpDelete] //fixed
    public String Delete(int id)
    {
        // TODO
        Console.WriteLine("Got the Employee ID : " + id);

        // Continue with delete logic 
    }

}
...