著作一覧 |
エラー処理のうち、おそらく予想通りに動作するのは、返されたETag(カラムの同時実行制御属性をFIXEDにすると__metadataフィールドにuriやtypeと一緒にオブジェクトとしてパッケージされる)をIf-Matchヘッダで指定した場合のHTTPステータス(precondition not match)だけ(etagをオブジェクトに設定して送信すると500になってメッセージが「ETagはIf-Matchに入れろ」となるけど、これもなんだかなぁな仕様)。ほとんどすべてのエラーが単純にInternal Server Errorになるので、普遍的に発生するKEY重複みたいなものは検出できない。
無理矢理がんばるとすると、Serviceのエラーハンドラで、Inner Exceptionにラップされた元のSQL例外を拾って、それをMessageボディに入れてやってクライアントで検出するしかない(何をやろうがHTTPステータスコードは500になってしまう)。
と、実にくせがある。
くせがあると言えば、PUTはすべてのカラムが対象になり、省略したカラムにはNULLが入る。突然ほとんどからっぽになってびっくりした。
で、指定したカラムだけを更新するには、MERGEというメソッドを使う。これは明らかに馬鹿な仕様なので、現在出ているCTP1では、PATCHに直している(というか、直しているのではなくPATCHを「追加」しているだけなことを祈る)。というか、WCF Data Serviceの連中はHTTPのプロトコルを知らないんじゃないか(で、誰かが指摘してあわててPATCHを持ってきたとか。というか、PUTでそう振る舞えば良いのになぁ)。
ジェズイットを見習え |