【问题标题】:.netcore PUT method 405 Method Not Allowed.netcore PUT 方法 405 方法不允许
【发布时间】:2019-11-24 11:08:09
【问题描述】:

我有一个简单的模型,因为它有 2 个字段,并且使用以下 put 方法,我想在数据库中更新它。包括 delete 在内的所有方法都有效,但是 put 方法总是在 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();
}

【问题讨论】:

  • 首先观察到被调用的URL与控制器动作的路由模板不匹配。

标签: c# asp.net-core asp.net-core-routing


【解决方案1】:

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

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

【讨论】:

  • 如果您不想卸载WebDav,也可以通过在应用程序的文件夹中添加一个web.config来排除该模块。添加以下部分:` `
  • 谢谢!我自己永远也想不通!
【解决方案2】:

使用[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)

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

【讨论】:

  • 为什么在那里使用 EF 模型是个坏主意?
  • DTO 是减少流量、控制序列化、安全性、关注点分离等的好习惯......请参阅stackoverflow.com/a/5910546/6844481
【解决方案3】:

首先观察的是被调用的URL

api/masters

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

api/masters/{id:int}

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

PUT api/masters/1

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 在主机(plesk)上发布后我遇到了同样的问题。有了这个解决方案,我的问题就解决了。
    • 对于IIS来说,是正确的解决方案
    【解决方案5】:

    你的方法应该是

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

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

    请求网址应该是

    PUT api/masters/1
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 2019-10-28
      相关资源
      最近更新 更多