相信很多朋友都有遇到過,我們用 ASP.NET MVC 或 ASP.NET WebApi 做好的標記有 HttpPut、HttpDelete 的 Action,部署到 IIS 伺服器之後,試著去發 Request 卻收到 404、405 的錯誤訊息,除非我們只寫 HttpGet、HttpPost 方法,不然有大於 87% 的機率會遇到,底下就來記錄一下解決的方式。
要處理這個問題,要先了解 IIS 中的 處理常式對應(Handler Mappings)
,MVC 或 WebApi 所打造而成的 Web 服務通常是沒有副檔名的 URL,對於沒有副檔名的 URL 預設會由這幾個 Handler 來處理。
遇到 405 Method Not Allowed
這個用戶端錯誤的訊息是由 WebDAVModule
所回應的,我們所發的 Request 被分配給了 WebDAV Handler
並傳遞給 WebDAVModule 進行後續處理。
WebDAV 是什麼? 它的全名叫 Web Distributed Authoring and Versioning,相關的資訊 Google 一下就有了,由於我們的站台並沒有開啟 WebDAV 服務,WebDAVModule 收到之後也就只能回 405 給我們了。
怎麼辦?
在 Web.Config 把 WebDAV Handler 及 WebDAVModule 移掉就行了
但我更傾向於如果沒有打算提供 WebDAV 服務的話,就從伺服器上把它移掉。
遇到 404 Not Found
這是 IIS 找不到適合處理的 Handler,我們可以打開那幾個處理無副檔名 URL 的 Handler 設定畫面來看,在指令動詞
的頁籤可以看到允許的指令動詞中沒有 PUT 及 DELETE。
怎麼辦?
我們要知道一個 Request 最多只會有一個 Handler 接收處理,所以我們要找出接收 ASP.NET MVC 及 ASP.NET WebApi Request 的 Handler 是哪一個?
如果我們的管線模式是傳統式
的話,會是這兩個的其中一個,32bit 就用 32bit,64bit 就用 64bit,後續傳遞給 IsapiModule 處理。
如果我們的管線模式是整合式
的話,就會由 ExtensionlessUrlHandler-Integrated-x.0
接收,並傳遞給 System.Web.Handlers.TransferRequestHandler
處理。
因此我們 Google 到的解法大都是叫我們在 Web.Config 裡面,在這三個 Handler 上添加上我們要使用的指令動詞。
如果我們確信已經不再使用傳統式管線模式,可以直接從 IIS 的處理常式對應去設定。