.netcore PUT 方法 405 Method Not Allowed

Sin*_*5k4 1 c# asp.net-core asp.net-core-routing

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

在此处输入图片说明

放置方法:

{
    "MasterId":1,
    "MasterName":"Test"
}
Run Code Online (Sandbox Code Playgroud)

行动

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

    //...some code
    return NoContent();
}
Run Code Online (Sandbox Code Playgroud)

小智 10

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

<configuration> 
    <system.webServer>
        <modules>
             <remove name="WebDAVModule" />
        </modules>
    </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)


Sha*_*ani 7

使用[HttpPut("{id:int}")]路由属性,您需要通过以下方式引用您的 api:http://localhost:5000/api/masters/ {id}

在你的例子中:

PUT http://localhost:5000/api/masters/1

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

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

将实体框架对象暴露给客户端是一个不好的做法,您应该使用 DTO 类并将其映射到实体框架对象。

  • DTO 是最小化流量、控制序列化、安全性、关注点分离等的良好实践...请参阅 /sf/answers/413738251/ (3认同)

Ily*_*dik 7

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

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

  • 如果您不想卸载 WebDav,还可以通过将 web.config 添加到应用程序的文件夹中来排除该模块。添加以下部分: ` &lt;system.webServer&gt; &lt;modules&gt; &lt;remove name="WebDAVModule" /&gt; &lt;/modules&gt; &lt;handlers&gt; &lt;remove name="WebDAV" /&gt; &lt;/handlers&gt; &lt;/system.webServer &gt; ` (2认同)