删除 http://localhost:54178/api/employees 405(方法不允许)

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

我正在使用带有 C# WEB 的 React Client 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
      );
  };

WEB 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" />

但是没有用。

知道是什么原因造成的吗?

这可能是几件事中的一件(或两件)。

  1. 该路线未自动注册为 DELETE。您可以通过在 Delete 操作上方添加 using [HttpDelete] 来解决此问题。
  2. 它不是在寻找正文中的 id。根据规范,DELETE 方法 may contain a body,但这并不意味着 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
      );
  };

您应该告诉框架在控制器上寻找带有动作动词属性的删除方法,方法如下:

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 
    }

}