.netcore PUT 方法 405 方法不允许

.netcore PUT method 405 Method Not Allowed

我有一个简单的模型,因为它有 2 个字段并使用以下 put 方法,我想在数据库中更新它。包括 delete 在内的所有方法都有效,但是 put 方法总是 returns Postman 中的 405 错误。 (也尝试过 WebDAV 解决方案。)我在这里缺少什么?

放置方法:

{
    "MasterId":1,
    "MasterName":"Test"
}

动作

[HttpPut("{id:int}")]
public async Task<IActionResult> PutMaster(int id, Master master)
{
    if (id != master.MasterId)
    {
        return BadRequest();
    }

    //...some code
    return NoContent();
}

使用 [HttpPut("{id:int}")] 路由属性,您需要将 api 引用为:http://localhost:5000/api/masters/{id}

在你的例子中:

放置http://localhost:5000/api/masters/1

所以参数中的 id 也不需要:

[HttpPut("{id:int}")] 
public async Task<IActionResult> PutMaster(Master master)

并且将 entity framework 对象公开给客户端是一种不好的做法,您应该使用 DTO class 并将其映射到 entity framework 对象。

首先观察到被调用的 URL

api/masters

不匹配控制器操作 [HttpPut("{id:int}")] 的路由模板,它将映射到 URL like

api/masters/{id:int}

调用与操作的路由模板匹配的正确 URL

PUT api/masters/1

错误本身是因为您很可能有另一个路由匹配提供的 URL 但不匹配 HTTP 动词。就像控制器操作之一的根[HttpGet]。这解释了为什么您会收到 405 Method Not Allowed 错误而不是 404 Not Found 错误

你的方法应该是

 [HttpPut("{id:int}")]
        public async Task<IActionResult> PutMaster(int id,[FromBody]  Master master)
{}

您需要在方法中添加[FromBody]属性。

请求url应该是

PUT api/masters/1

如果您使用 IIS 来 运行 您的应用程序并且有 WebDav 模块,那可能是个问题。由于某些奇怪的原因,WebDav 不允许 PUT。

我刚刚卸载了它,它很有帮助。

如果您的应用程序托管在 运行 API ASP.NET 核心中的 IIS 下,请将此行包含在 Web.Config 文件中

<configuration> 
    <system.webServer>
        <modules>
             <remove name="WebDAVModule" />
        </modules>
    </system.webServer>
</configuration>