我怎样才能像对待 PATCH 路由一样对待我的 HTTP PUT 路由?

How can I have my HTTP PUT routes treated the same way as PATCH routes?

我有一个 ASP.NET Core web API 控制器基础 class 可以缩短为以下内容:

[Route("my/route")]
public abstract class ControllerBase
{
    [HttpPut]
    [Route("")]
    public MyObject Update([FromBody] MyObject obj) => obj;
    
    [HttpPut]
    [Route("{*id}", Order = 1)]
    public MyObject Update([FromUri] String id, [FromBody] MyObject obj) => obj;
    
    [HttpPatch]
    [Route("")]
    public MyObject Patch([FromBody] JObject data) => new MyObject();
    
    [HttpPatch]
    [Route("{*id}", Order = 1)]
    public MyObject Patch([FromUri] String id, [FromBody] JObject data) => new MyObject();
}

现在,想象调用以下四个端点:

  1. PUT /my/route
  2. PUT /my/route/42
  3. PATCH /my/route
  4. PATCH /my/route/42

在 ASP.NET(使用 .NET Framework)中,所有四个过去都可以工作。

现在应用程序已切换到 .NET Core 并使用 ASP.NET Core,调用 1 和 2,即两个 HTTP PUT 调用,return 405/Method Not Allowed. HTTP PATCH 调用仍然像以前一样工作。

似乎 ASP.NET Core 的路由行为与 ASP.NET 的路由行为有些不同,但为什么它对一种 HTTP 方法的行为方式相同而对另一种方法的行为方式不同?

经过一些挖掘,我找到了 的答案,其中建议在 ASP.NET Core 中,查询字符串参数也需要添加到方法属性中。因此,我尝试如下更改 PUT 方法,但无济于事:

    [HttpPut("")]
    [Route("")]
    public MyObject Update([FromBody] MyObject obj) => obj;
    
    [HttpPut("{*id}", Order = 1]
    [Route("{*id}", Order = 1)]
    public MyObject Update([FromUri] String id, [FromBody] MyObject obj) => obj;

我需要做什么才能使 PUT 端点再次工作,就像 PATCH 端点仍然一样?

问题出在 IIS 中的 WebDAV 模块。

我使用 Windows 的 Add/Remove 功能将其从我的系统中完全删除,完成后,HTTP PUT 调用将按预期再次工作。