豚吐露@wiki
WebApi2使ってRestfulなサービスを作ろうとしたら405が返ってくる
最終更新:
Bot(ページ名リンク)
-
view
WebApi2使ってRestfulなサービスを作ろうとしたら405が返ってくる
Windows 7 Professional
Visual Studio 2013 Professional
Visual Studio 2013 Professional
ASP.NET MVC5
ASP.NET Web API 2.1
ASP.NET Web API 2.1
RestfulなサービスをWebAPI2使って作ろうとしたら、PUTとDELETEで405が返ってきて盛大にハマったのでメモ。
巷ではWebDAVが原因でPUTとDELETEが使えないという話で溢れてたけど、今回は別の原因だった。
そもそもWebDAVはinstallしていない...

そもそもWebDAVはinstallしていない...

WebApiのcontrollerの作り方は以下のようにいくつも方法が用意されている。
① controllers右クリックから[追加]-[コントローラー]を選択し、『Web Api 2 コントローラー - 空』を選択して追加。
ID: ApiControllerEmptyScaffolder
② controllers右クリックから[追加]-[コントローラー]を選択し、『読み取り/書き込みアクションがある Web Api 2 コントローラー』を選択して追加。
ID: ApiControllerWithActionsScaffolder
③ controllers右クリックから[追加]-[Web Api コントローラー クラス (v2.1)]を選択して追加。
④ controllers右クリックから[追加]-[クラス]を選択し、『Web Api コントローラー クラス (v2.1)』を選択して追加。
※他にもあるけど、割愛。
ID: ApiControllerEmptyScaffolder
② controllers右クリックから[追加]-[コントローラー]を選択し、『読み取り/書き込みアクションがある Web Api 2 コントローラー』を選択して追加。
ID: ApiControllerWithActionsScaffolder
③ controllers右クリックから[追加]-[Web Api コントローラー クラス (v2.1)]を選択して追加。
④ controllers右クリックから[追加]-[クラス]を選択し、『Web Api コントローラー クラス (v2.1)』を選択して追加。
※他にもあるけど、割愛。
で、①~④の方法を使って生成されるcodeに差異はあれど、機能的には差異は無い。と思っていたが、大間違いだった。orz
結論から言うと、①の方法で作ったcontrollerでは、GETとPOST以外のHTTPメソッドは受け付けない。
どんだけweb.configいじってもダメでした。(´・ω・`)
どんだけweb.configいじってもダメでした。(´・ω・`)
↓この方法だけは絶対選んじゃダメ!!


なので、①の方法で作るcontrollerはGETとPOST専用にするか、①の方法ではcontrollerを作らない。のが良いと思う。
正直なところ、『①の方法ではcontrollerを作らない。』を推奨する。
なんでかってぇと、①で生成されたcontrollerに、PUTやDELETEのメソッド追加すると②~④のメソッドと区別つかなくなっちゃうので...orz
本当に見分ける方法無いので...
特に、複数人で開発してるんであれば、このルールは徹底したほうが良い。
なんでかってぇと、①で生成されたcontrollerに、PUTやDELETEのメソッド追加すると②~④のメソッドと区別つかなくなっちゃうので...orz
本当に見分ける方法無いので...
特に、複数人で開発してるんであれば、このルールは徹底したほうが良い。
これはVisualStudioのバグなのか?仕様なのか?
今のところ①の方法で作ったcontrollerを②~④の方法で作ったcontrollerと同等にする方法は判明しておりません。(´・ω・`)
今のところ①の方法で作ったcontrollerを②~④の方法で作ったcontrollerと同等にする方法は判明しておりません。(´・ω・`)
これ知らんで開発進めたら...すっげぇ後半になって、『あれ?このcontrollerでDELETE使えない!!?Σ(゚Д゚;)』って大騒ぎになりかねんな。
参考までに個人的に調査した情報を記載しておくと...
- ①の方法で作成したcontrollerにGET,POST以外でrequestすると、response headerに『Allow』が『GET,POST』固定で定義されてるのが確認できる。
- web.configでAllowの定義をいじっても、①の方法で作成したcontrollerへは反映されない。response headerの『Allow』に影響は無い。
- 『customHeaders』で『Access-Control-Allow-Methods』を設定しても『Allow』の定義の方が優先される。
- ①以外の方法で作成したcontrollerなら『customHeaders』で『Access-Control-Allow-Methods』を定義すればHttpメソッドに対する処理は上書きされる。※GET,POST以外も通る。
更新日: 2014年11月27日 (木) 14時57分03秒