4 回答

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

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

TA貢獻1946條經驗 獲得超3個贊
我認為在你的控制器中你必須導入另一個庫。嘗試
using System.Web.Http;
代替
using Microsoft.AspNetCore.Mvc

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。
- 4 回答
- 0 關注
- 196 瀏覽
添加回答
舉報