4 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
簡(jiǎn)短回答
事情可能就是這么簡(jiǎn)單。原因是路由。
只需將您的POST
請(qǐng)求發(fā)送到正確的 URL,例如https://localhost:44327/api/values/123
.
這不是問(wèn)題。它按預(yù)期工作。
您GET向 提出請(qǐng)求https://localhost:44327/api/values/。它返回200 OK。
但是當(dāng)你POST向同一個(gè) URL 發(fā)出請(qǐng)求時(shí)https://localhost:44327/api/values/。它說(shuō)405 Method not allowed。
然而,你得到了405。發(fā)生這種情況是因?yàn)槟贕ET使用方法到達(dá)終點(diǎn)POST。
微軟文檔說(shuō):
...HTTP 客戶端向 Web 服務(wù)器上的 Web API 應(yīng)用程序的 URL 發(fā)送了有效的 JSON 請(qǐng)求,但服務(wù)器返回了 HTTP 405 錯(cuò)誤消息,表明該 URL 不允許使用 PUT 方法。相反,如果請(qǐng)求 URI 與 Web API 應(yīng)用程序的路由不匹配,服務(wù)器將返回 HTTP 404 Not Found 錯(cuò)誤。
https://learn.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications
如果只是刪除GET端點(diǎn)。請(qǐng)求POST將開(kāi)始返回404 Not found。這意味著您沒(méi)有到達(dá)任何已注冊(cè)的路線。
要發(fā)送POST請(qǐng)求,您需要根據(jù)路由規(guī)則使用不同的 URL。
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
? ? // POST api/values
? ? [HttpPost("{val}")]
? ? public StatusCodeResult Post()
? ? {
? ? ? ? return Ok();
? ? }
}
這種基于屬性的配置意味著您的POST端點(diǎn)的路由是/api/Values/{val}。哪里{val}有什么價(jià)值。它不在端點(diǎn)中進(jìn)行處理。
如果你想處理它,你應(yīng)該將它傳遞給方法:
[HttpPost("{val}")]
public StatusCodeResult Post(string val)
{
? ? return Ok();
}

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
查看您定義的內(nèi)容:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
然后是動(dòng)作:
[HttpPost("{val}")]
public StatusCodeResult Post()
{
? ? ? ? return Ok();
}
您的路由匹配以下 url:
https://localhost:44327/api/values/StatusCodeResult
它將采用控制器上定義的主路由 [Route("api/[controller]")]
然后您定義“模板”以使用“{val}”
這告訴它使用 ActionResult特定名稱并期望 var val 被傳遞/附加。
在“路由模板中的令牌替換([控制器]、[操作]、[區(qū)域])”部分下
他們具體說(shuō)明:
為了方便起見(jiàn),屬性路由通過(guò)將標(biāo)記括在方括號(hào) ([, ]) 中來(lái)支持標(biāo)記替換。標(biāo)記 [action]、[area] 和 [controller] 將替換為定義路由的操作中的操作名稱、區(qū)域名稱和控制器名稱的值。在以下示例中,操作與注釋中所述的 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) {
? ? // ...
? }
}
如果您希望它僅基于動(dòng)詞進(jìn)行路由(遵循每個(gè) api 端點(diǎn)僅處理該特定對(duì)象的操作的模式),那么您可以將 post 方法更改為
? ? [HttpPost]
? ? public ActionResult Post(string val)
? ? {
? ? ? ? return Ok();
? ? }

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
我認(rèn)為在你的控制器中你必須導(dǎo)入另一個(gè)庫(kù)。嘗試
using System.Web.Http;
代替
using Microsoft.AspNetCore.Mvc

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
你的github上的代碼,
// POST api/values
[HttpPost("{val}")]
public StatusCodeResult Post()
{
? ? ?return Ok();
}
每個(gè)路由操作配置都需要一個(gè)值 {val}。由于您可能會(huì)嘗試在沒(méi)有任何價(jià)值的情況下?lián)糁刑樱虼诉@是不允許的。確保您提供一些值,然后執(zhí)行 POST。如果您使用的是 POSTMAN,則可能必須為請(qǐng)求的正文提供一些值。Swagger 是一個(gè)很棒的實(shí)用工具,可以嵌入到 Web API 中,并且為我們的路線/資源提供了出色的直觀 UI。這甚至可能是幫助確定并確保您提供正確價(jià)值的理想選擇。
否則,您無(wú)需修改或擔(dān)心 IIS 或 IIS Express 設(shè)置?;?webdav。
- 4 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)