豚吐露@wiki

WebApi2使ってRestfulなサービスを作ろうとしたら405が返ってくる

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可

WebApi2使ってRestfulなサービスを作ろうとしたら405が返ってくる

Windows 7 Professional
Visual Studio 2013 Professional

ASP.NET MVC5
ASP.NET Web API 2.1

RestfulなサービスをWebAPI2使って作ろうとしたら、PUTとDELETEで405が返ってきて盛大にハマったのでメモ。

巷ではWebDAVが原因でPUTとDELETEが使えないという話で溢れてたけど、今回は別の原因だった。
そもそも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)』を選択して追加。
 ※他にもあるけど、割愛。

で、①~④の方法を使って生成されるcodeに差異はあれど、機能的には差異は無い。と思っていたが、大間違いだった。orz

結論から言うと、①の方法で作ったcontrollerでは、GETとPOST以外のHTTPメソッドは受け付けない。
どんだけweb.configいじってもダメでした。(´・ω・`)

↓この方法だけは絶対選んじゃダメ!!

なので、①の方法で作るcontrollerはGETとPOST専用にするか、①の方法ではcontrollerを作らない。のが良いと思う。

正直なところ、『①の方法ではcontrollerを作らない。』を推奨する。
なんでかってぇと、①で生成されたcontrollerに、PUTやDELETEのメソッド追加すると②~④のメソッドと区別つかなくなっちゃうので...orz
本当に見分ける方法無いので...
特に、複数人で開発してるんであれば、このルールは徹底したほうが良い。

これはVisualStudioのバグなのか?仕様なのか?
今のところ①の方法で作った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秒

名前:
コメント:

すべてのコメントを見る
記事メニュー
ウィキ募集バナー