xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

Web APIでPUT/DELETEに失敗するときの対処

ひと月ほど前、仕事でASP.NET Web APIを使った開発をしていたときでした。コントローラーにキチンとCRUDを実装し、開発環境のIIS Expressで動作確認も無事終え、部内のテストサーバーのIISにホストしました。そしてそのAPIを利用することになっている同僚に「できたよ!使ってみてー♪」と意気揚々と声を掛けた数分後。

同僚 : 「ねぇ、PUTで呼べばイイんだよね?」
自分 : 「そうだよー」
同僚 : 「やってるけど405のエラー返ってくるよ?」
自分 : 「...え?」
同僚 : 「ちゃんとデバッグした?」
自分 : 「こっちの環境では間違いなく動いてるよ。...ほら」
同僚 : 「ホントだ。あ、じゃなくてサーバーにホストしてあるやつは?」
自分 : 「あ、そうか。...あれ?マジでエラー出るね。どゆことだコレ?」
同僚 : 「あはははは!じゃ、修正よろしくー!ww」

と、ワケの分からない405エラー (Method Not Allowed) に遭遇。もう少し試してみたところ、GETやPOSTは問題なく動くけどPUT/DELETEでのアクセスができない。でも、できないハズはない。

回避方法

ローカル環境で動いているのにホスト先で動かないとなると、ホストサーバーのIISとアプリケーション設定の組み合わせがどこか良くないと言えます。そんなこんな調べていたらWeb.configでWebDAVの設定を変更する方法が見つかり、それを適用したら解決できました。

<system.webServer>
    <handlers>
        <remove name="WebDAV" />
        <add name="WebDAV" path="*" verb="*" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
    </handlers>
</system.webServer>

正直なところWebDAVについてはちっとも詳しくなく、上の設定が本当に適当なものなのかどうか分かりません...。とりあえずは動くようにはなってメデタシなのですが、何か他に良くない影響が出ていたりするのではないかとの懸念は無きにしも非ず。これの良くない点やより良い解決をご存じの方は@xin9leまでご連絡くださいm( )m

ちなみに、Windows Azureでは上記のWeb.configの設定がなくてもPUT/DELETEを呼び出すことができました。となると、ホストサーバーのIISWebDAV周りの設定自体が違っていることになりそう。それをWeb.configでオーバーライドして変更しているってことなのかな。

参考サイト [追記 : 2013/11/9 23:58]

Stack Overflowさんに参考になりそうな投稿があると教えていただきました。「WebDAVをアンインストールしなくてもWeb.configをいじってアプリケーションレベルで対応できるよ!」的な雰囲気で、上記と似たような事が書いてある気がします。どうやら方向性は間違ってなさそうですね!(英語はかなり苦手...

ASP.NET Web API - PUT & DELETE Verbs Not Allowed - IIS 8
Asp.NET Web API - 405 - HTTP verb used to access this page is not allowed - how to set handler mappings