为了账号安全,请及时绑定邮箱和手机立即绑定

.Net Core 2.2 Web API 405

.Net Core 2.2 Web API 405

C#
侃侃无极 2023-07-09 16:36:52
我正在尝试设置 .net core 2.2 Web api 来使用后动词。除了 get 动词之外的任何其他操作都会返回 405,无论它是在我的本地计算机 (w10 iis eXPRESS 10.0) 还是 Windows 服务器 (2016 R2 IIS 8.0) 上运行。我读过有关在配置文件中禁用 WebDav、添加路由以及完全删除 WebDav 功能的其他文章。我已经做了所有这些都没有效果。我刚刚开始在核心中进行开发,发现这令人困惑,在同一台服务器上是一个在 .net Framework 4.5 上运行的非核心 Web api,它可以毫无错误地处理 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>
查看完整描述

4 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

简短回答

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

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



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


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


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


然而,你得到了405。发生这种情况是因为您正在GET使用方法到达终点POST。


微软文档说:


...HTTP 客户端向 Web 服务器上的 Web API 应用程序的 URL 发送了有效的 JSON 请求,但服务器返回了 HTTP 405 错误消息,表明该 URL 不允许使用 PUT 方法。相反,如果请求 URI 与 Web API 应用程序的路由不匹配,服务器将返回 HTTP 404 Not Found 错误。


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();

}


查看完整回答
反对 回复 2023-07-09
?
POPMUISE

TA贡献1765条经验 获得超5个赞

查看您定义的内容:


[Route("api/[controller]")]

[ApiController]

public class ValuesController : ControllerBase

然后是动作:


[HttpPost("{val}")]

public StatusCodeResult Post()

{

        return Ok();

}

您的路由匹配以下 url:

https://localhost:44327/api/values/StatusCodeResult

它将采用控制器上定义的主路由 [Route("api/[controller]")]

然后您定义“模板”以使用“{val}”

这告诉它使用 ActionResult特定名称并期望 var val 被传递/附加。


在“路由模板中的令牌替换([控制器]、[操作]、[区域])”部分下

他们具体说明:

为了方便起见,属性路由通过将标记括在方括号 ([, ]) 中来支持标记替换。标记 [action]、[area] 和 [controller] 将替换为定义路由的操作中的操作名称、区域名称和控制器名称的值。在以下示例中,操作与注释中所述的 URL 路径匹配:

[Route("[controller]/[action]")]

public class ProductsController : Controller

{

  [HttpGet] // Matches '/Products/List'

  public IActionResult List() {

    // ...

  }


  [HttpGet("{id}")] // Matches '/Products/Edit/{id}'

  public IActionResult Edit(int id) {

    // ...

  }

}

如果您希望它仅基于动词进行路由(遵循每个 api 端点仅处理该特定对象的操作的模式),那么您可以将 post 方法更改为


    [HttpPost]

    public ActionResult Post(string val)

    {

        return Ok();

    }


查看完整回答
反对 回复 2023-07-09
?
智慧大石

TA贡献1946条经验 获得超3个赞

我认为在你的控制器中你必须导入另一个库。尝试

using System.Web.Http;

代替

using Microsoft.AspNetCore.Mvc


查看完整回答
反对 回复 2023-07-09
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

你的github上的代码,


// POST api/values

[HttpPost("{val}")]

public StatusCodeResult Post()

{

     return Ok();

}

每个路由操作配置都需要一个值 {val}。由于您可能会尝试在没有任何价值的情况下击中帖子,因此这是不允许的。确保您提供一些值,然后执行 POST。如果您使用的是 POSTMAN,则可能必须为请求的正文提供一些值。Swagger 是一个很棒的实用工具,可以嵌入到 Web API 中,并且为我们的路线/资源提供了出色的直观 UI。这甚至可能是帮助确定并确保您提供正确价值的理想选择。


否则,您无需修改或担心 IIS 或 IIS Express 设置。或 webdav。


查看完整回答
反对 回复 2023-07-09
  • 4 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信