簡體   English   中英

在WebAPI2中獲取PUT和DELETE謂詞以在IIS 8.5上運行

[英]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命令都沒有通過該站點:

  1. 1/10/2017 1:22:41 PM / api / RegistrationBatch / 200 GET
  2. 1/10/2017 1:22:55 PM / api / RegistrationBatch / 200 POST

似乎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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM