c# - .Net 核心 2.2 Web API 405

标签 c# .net webdav visual-studio-2019 .net-core-2.2

我正在尝试设置 .net core 2.2 web api 以使用后置动词。无论是在我的本地计算机(w10 iis eXPRESS 10.0)还是在 Windows 服务器(2016 R2 IIS 8.0)上运行,除 get 动词之外的任何内容都会返回 405。我已经阅读了有关在您的配置文件中禁用 WebDav、添加路由以及完全删除 WebDav 功能的其他帖子。我做了所有这些都无济于事。我刚刚开始在核心中开发并发现这令人费解,在同一台服务器上是一个非核心 web api,它在 .net 框架 4.5 上运行,可以无错误地处理 GET、PUT、POST、DELETE。是的,我在更改任何配置后重新启动了服务器。以下是我所做的 web.config 更改,最后一个直接来自 MS。在我的机器和服务器上重现相同错误的基本项目在这里 https://github.com/FranciscanMedia/error405_core/tree/master它只是启动 VS2019 时获得的标准 Web API 项目。

<system.webServer>    
    <handlers accessPolicy="Read, Script">
       <remove name="WebDAV" />
       <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
       <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"
          path="*."
          verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
          modules="IsapiModule"
          scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"
          preCondition="classicMode,runtimeVersionv4.0,bitness64"
          responseBufferLimit="0" />
    </handlers>
</system.webServer>
<system.webServer>    
    <modules>        
        <remove name="WebDAVModule" />    
    </modules>    
    <handlers>        
        <remove name="WebDAV" />    
    </handlers>
</system.webServer>
<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="false">
        <remove name="WebDAVModule"/>
    </modules>    
</system.webServer>
<system.webServer>
    <handlers accessPolicy="Read, Script">
        <remove name="WebDAV" />
        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
        <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"
           path="*."
           verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
           modules="IsapiModule"
           scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"
           preCondition="classicMode,runtimeVersionv4.0,bitness64"
           responseBufferLimit="0" />
    </handlers>
</system.webServer>

最佳答案

简答

它可能就这么简单。原因是路由。

只需将您的 POST 请求发送到正确的 URL,例如 https://localhost:44327/api/values/123

POST request to correct and incorrect endpoints


详细解释

这不是问题。它按预期工作。

您向 https://localhost:44327/api/values/ 发出了 GET 请求。它返回 200 OK

但是当您向同一 URL https://localhost:44327/api/values/ 发出 POST 请求时。它说 405 Method not allowed

但是,您得到 405。这是因为您正在使用 POST 方法访问 GET 端点。

Microsoft Docs says:

... the HTTP client sent a valid JSON request to the URL for a Web API application on a web server, but the server returned an HTTP 405 error message which indicates that the PUT method was not allowed for the URL. In contrast, if the request URI did not match a route for the Web API application, the server would return an HTTP 404 Not Found error.

https://learn.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications

如果您只是删除 GET 端点。 POST 请求将开始返回 404 Not found。这意味着您没有到达任何已注册的路线。

要发送POST请求,您需要根据路由规则使用不同的URL。

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{

    // POST api/values
    [HttpPost("{val}")]
    public StatusCodeResult Post()
    {
        return Ok();
    }
}

这种基于属性的配置意味着您的 POST 端点的路由是 /api/Values/{val}<​​。其中 {val}<​​ 是任何值。它不在端点中处理。

如果你想处理它,你应该把它传递给方法:

[HttpPost("{val}")]
public StatusCodeResult Post(string val)
{
    return Ok();
}

关于c# - .Net 核心 2.2 Web API 405,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57149312/

相关文章:

c# - 使用卷积在连续的声音流中找到引用音频样本

c# - Visual Studio 2013 中的 "Are you missing a using directive or an assembly reference"

c# - `1 在 LINQ 中代表什么?

javascript - 如何从 .Net 代码隐藏中获取数据到 mixpanel (JavaScript)

c# - .NET - 如何通过数据库有效地搜索一个文本框中的多个字段?

c# - 在执行某些 Web 请求/响应任务后返回 View() 时,ASP.NET MVC 挂起

.net - 应用程序从远程文件夹启动时引发 SecurityException

只读服务器中的 Apache2 WebDAV 可写目录

php - PHP 中的 CardDAV 服务器

C# 独立 WebDAV