RESTfulな方法でWCFを使用することは素晴らしいようです。私はシンプルさや柔軟性などの大きな銃の大ファンですが、Urlsの最終的な見方も気に入っています。なんと言えば、私はプログラマーです。
リソースを取得および編集するための単純なAPIは、ほぼ同様に単純な可能なエラー応答のセットと一致します。「純粋な」RESTfulなアプローチを維持するために、顔をしかめるために鼻を切っているかもしれません。より具体的には、私のWebサービスの消費者の鼻。私は間違っている可能性がありますが、使用できるHttpエラーコードがあまり多くないようで、カスタムエラーメッセージを返す方法がありません。
明確にするために、私は適切な例外的なエラーと予想されないエラーについて話している。実際にユーザーに問題を通知して、ユーザーが問題を修正するために何をする必要があるかを識別できるようにしたいと考えています。
私が検討している可能なオプション...
HTTPエラーコードを使用するだけ –これは、表現できる内容が制限されすぎて、カスタムメッセージを提供できないようです。私が間違っている場合は、私を修正してください!.
常にHttp成功を返しますが、カスタムエラーオブジェクトを返します –明らかに最も柔軟ですが、最もRESTfulではありません。
誰かがこの特定の問題の実際の世界での経験を共有できれば、本当にありがたいです。
StatusDescription
オブジェクトのOutgoingWebResponseContext
プロパティの使用を提案していただきありがとうございます。最初は私が使えるものに思えた。
上記の2番目のオプションは私には適さないという結論に達しました。私はHttpが私に与えることができるものに固執したいと思います。
しかし、それを機能させるのに問題があります。このプロパティに指定した値に関係なく、応答では返されません。
私のサービス方法はこのようになります
public MyType GetMyTypes(string criteria)
{
try
{
return GetMyTypes();
}
catch (Exception ex)
{
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Forbidden;
response.StatusDescription = "A Big fat error occurred";
return null;
}
}
そして、これが生の応答メッセージです。カスタムメッセージについての言及はありません...
HTTP/1.1 403 Forbidden
サーバー:ASP.NET開発サーバー/9.0.0.0
日付:2009年1月7日水曜日14:01:20 GMT
X-AspNet-Version:2.0.50727
キャッシュ制御:プライベート
コンテンツの長さ:0
接続:閉じる
クライアントの正しいプロパティにアクセスする必要があるだけではありません。情報は単にリンクを介して送信されていません。
このStatusDescription
プロパティは実際に何をしますか?
StatusDescriptionプロパティの設定方法を知りませんでした。エラーメッセージはまったく含めず、HTTPステータスコードのみを使用しました。私は、サービスのSoapエンドポイントとRestfulエンドポイントの両方を公開することを選択しました。そのため、クライアントは、どちらを使用するかを選択できます-シンプルなRestfulメッセージまたは比較的リッチなSoapメッセージ。
適切な応答コードを送信すると、応答の本文にカスタムエラーメッセージを含めることができます。
.net 4では、 WebFaultException<T>
(T errorDetail,
HttpResponseCode
code)
ここでは、応答タイプを別のオブジェクトタイプに設定します。これは意味があり、必要なResponseCode
も設定します。
errorDetail
はシリアライズ可能でなければなりません
同様の質問については this thread を参照してください。
簡単に言えば、HTTPステータスコードを(エラーコードの1つに)設定し、カスタムメッセージを StatusDescription プロパティで提供できると思います。
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";
残念ながら、現実世界でのこの手法の普及についてはあまり知りません。
これは欠陥である可能性があります。 2011年9月22日の時点で、この問題は製品チームによって検討されています。