猿问

.Net Core 2.2 Web API 405

我正在尝试设置 .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>


侃侃无极
浏览 153回答 4
4回答

慕田峪7331174

简短回答事情可能就是这么简单。原因是路由。只需将您的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();}

POPMUISE

查看您定义的内容:[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();    }

智慧大石

我认为在你的控制器中你必须导入另一个库。尝试using&nbsp;System.Web.Http;代替using&nbsp;Microsoft.AspNetCore.Mvc

慕尼黑8549860

你的github上的代码,// POST api/values[HttpPost("{val}")]public StatusCodeResult Post(){     return Ok();}每个路由操作配置都需要一个值 {val}。由于您可能会尝试在没有任何价值的情况下击中帖子,因此这是不允许的。确保您提供一些值,然后执行 POST。如果您使用的是 POSTMAN,则可能必须为请求的正文提供一些值。Swagger 是一个很棒的实用工具,可以嵌入到 Web API 中,并且为我们的路线/资源提供了出色的直观 UI。这甚至可能是帮助确定并确保您提供正确价值的理想选择。否则,您无需修改或担心 IIS 或 IIS Express 设置。或 webdav。
随时随地看视频慕课网APP
我要回答