[英]DELETE/PUT verbs result in 404 Not Found in WebAPI, only when running locally
[英]Getting PUT and DELETE verbs in WebAPI2 to work on IIS 8.5
我試圖將代碼發布到我的公司測試Web服務器,當嘗試使用PUT或DELETE動詞調用任何方法時,我收到了從IIS返回的大量錯誤。 我已經研究過這個特殊問題,我嘗試的所有結果都沒有做任何事情,或者產生了新的錯誤。 當我嘗試使用默認的system.webServer配置時,我收到一般的405方法不允許錯誤,這里是web.config的那部分:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
從挖掘谷歌和幾篇堆棧文章,大多數接受的答案指定通過web配置文件刪除WebDAV,我已經完成了,這里是更新的代碼:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
當我嘗試使用剛刪除WebDAV處理程序時,我繼續得到405方法不允許錯誤,但是一旦我刪除了WebDAVModule,我的錯誤就變成了500內部服務器錯誤,從服務器查看實際上並沒有給我進一步的信息。
我還嘗試過關於刪除和添加“ExtensionlessUrlHandler-ISAPI-4.0_32bit”和“ExtensionlessUrlHandler-ISAPI-4.0_64bit”處理程序的建議,結果相同(405當我不刪除WebDAVModule或500時刪除它)。
這是我試圖調用的WebApi控制器上的方法,也許這就是問題所在,雖然它在我的開發環境中工作得很好:
public string PutRegistrationBatch(RegistrationBatch Model) {
// Code to save the model to our database
}
public string DeleteRegistrationBatch(RegistrationBatch Model) {
// Code to delete the item from the database
}
UPDATE
我在應用程序上運行了跟蹤,我看到GET和POST命令通過該站點,但是PUT或DELETE命令都沒有通過該站點:
似乎PUT和DELETE命令在主機級別被過濾掉並被拒絕,並且從未進入我的應用程序。
UPDATE
WebDAV似乎是潛在的問題,但我們運行的是利用這項技術的Web服務,因此在我們更新該服務之前刪除它不是一種選擇。 與此同時,我發現Scott Hanselman在這里( http://www.hanselman.com/blog/HTTPPUTOrDELETENotAllowedUseXHTTPMethodOverrideForYourRESTServiceWithASPNETWebAPI.aspx )概述的工作允許我作為POST請求發送PUT和DELETE請求。
我不建議這是問題的答案,但它至少允許我解決問題,直到我們可以卸載WebDAV,並希望這將允許我的Web Api 2應用程序正常工作。
您需要在相應的操作上應用[HttpPut]
和[HttpDelete]
屬性
[HttpPut]
public string PutRegistrationBatch(RegistrationBatch Model) { ... }
[HttpDelete]
public string DeleteRegistrationBatch(RegistrationBatch Model) { ... }
在配置文件中,您還應該嘗試使用您想要允許的特定動詞
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
如果安裝了WebDAV IIS功能,則可能會導致與Put,Delete和Patch請求發生沖突(可能更多......不記得了)。 您可以從服務器范圍卸載功能部件,也可以從system.webServer元素中手動刪除HttpModule和HttpHandler以定位此特定應用程序。 請參閱https://stackoverflow.com/a/26003440/179223
我記得前一段時間進入類似的溝渠。 最終這對我有用。
將“默認網站”和您的網站的所有模塊配置重置為IIS中的默認值。 您可以通過以下方式執行此操作:1。選擇您的網站,雙擊“模塊”2.單擊右側“動作”面板下的“恢復為父級”鏈接
在Web.config中使用以下內容
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.