著作一覧 |
WCF Data ServiceでPUTをやろうとしてはまりまくっていて、先が見えなくて困りきる(現在進行形)。
環境はWindows 2008 Server R2で、IISにはWebDAVも載せている(これは他の要件から必須)。で、WCF Data Serviceが独立した仮想ディレクトリにある。
GETはご機嫌に動いているのだが、いろいろあって、クライアント側は手作りJSONクライアント。
で、PUTをしたら、最初は401になる。
当然、URIがおかしいのだろうとか、メッセージボディがおかしいのだろうとか想像するのだが、わからん。URIは、GETしたJSONのd/resultsの中の__metadataのuriを指定しているからおかしくはないはず。メッセージボディはおかしいだろうと思うが(だからテストしてるわけだし)、でもそれで401ってのはおかしい。
いろいろ調べると、WebDAVが悪さをしているという説を見つけ、WCF Data Serviceの仮想ディレクトリのHTTPハンドラから、WebDAVを削除する。
すると、405が返るようになった。わからん。
そこで、モジュールからWebDAVを抜いてみた(WebDAVが影響しているのは401の解消から間違いなさそうだと考えた)。
すると500が返るようになった。よっしゃ。
が、全然よっしゃじゃない。おれは、svcに制御がわたって、そこで500になっているのだと思ったのだが、DataService
そこで、IISのパイプラインのログを見ると、2ステップ程度で500を返している。WCFに制御が来ていない。
で、どうもWebDAVをモジュールから削除したのがまずそうだと、いろいろいじったり、IISを再起動したりして、ついWCF Data Serviceの再デプロイをやったらWeb.configが上書きされて元通り。
401が返るようになった。
で、ハンドラからWebDAVを削除して405まで再現させた。
上の経緯から、405を返しているのは、パイプラインの途中にいるハンドラらしいというのは当たりはつくが、一体どうやって探せば良いのか、そいつが問題だ。
HTTP Error 405 With ASP.Net MVC and HTTP PUT on IIS 7.5というのを見つけたが、この人はWebDAVが405を返すからハンドラから削除したと書いている。おれのとは異なる出方だなぁ。
WCF ASP.NET (405) Method Not Allowedというのは、POSTが405になるというので、また異なる問題のようだ(GETはうまくいっているのかな?)。(IIS Hosted Service Failsなんてのもあるが、3.5だし、*.svcに対するGETは処理できているから異なる原因だろう)
IIS 7.5 WCF service: (405) Method Not Allowed.に、ログの取り方が出ているからそれをまずは試してみることにしよう。
それはそれとして、IIS+WCF関係で検索していると、http://ja.w3support.netというのがやたらと引っ掛かって、まったく理解不能な間違った日本語翻訳で困る。原文が引っ掛かるのなら良いのだが、こういうゴミのような日本語翻訳はspamの一種として検索から除外してくれないかなぁ。
追記:結局、アプリケーションプールをパイプラインからクラシックに変更したら動作するようになった。でも、環境によってはパイプラインでも動作するらしいので、クラシックを使うのは最後の手段としたほうが良さそうだ。
ジェズイットを見習え |