亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

.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 關注
  • 196 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號