RESTfulな方法でWCFサービスからエラーを返す最良の方法は何ですか?
-
03-07-2019 - |
質問
WCFをRESTfulな方法で使用するのは素晴らしいようです。 I <!>#8217; mシンプルさと柔軟性のような大砲の大ファンですが、Urlの見た目も気に入っています。私は何と言えますか、私はプログラマです。
リソースを取得および編集するための単純なAPIは、ほぼ同様に単純な一連のエラー応答と一致します。<!>#8217; <!>#8220; pure <! >#8221; RESTfulなアプローチ私は、顔、またはより具体的には、Webサービスの消費者の鼻に反して鼻を切っているかもしれません。私は間違っている可能性がありますが、<!>#8217; tは使用できるHttpエラーコードが非常に多くないようで、カスタムエラーメッセージを返す方法はありません。
明確にするために、適切な例外エラーについて説明し、予期しないエラーについて説明しています。実際にユーザーに問題を伝えて、ユーザーがそれを修正するために必要なことを特定できるようにします。
考えられるオプション...
-
Httpエラーコードを使用するだけ <!>#8211;これは、私が表現できることを制限しすぎているように思われ、<!>#8217; tカスタムメッセージを提供することはできません。間違っている場合は修正してください。
-
常にHTTP成功を返しますが、カスタムエラーオブジェクトを返します <!>#8211;明らかに最も柔軟ですが、確かに最もRESTfulではありません。
誰もがこの特定の問題の現実世界の経験を共有できれば本当に感謝しています。
更新
StatusDescription
オブジェクトのOutgoingWebResponseContext
プロパティを使用することを提案してくれてありがとう。最初は私が使用できるもののように思えました。
上記の2番目の選択肢は私には向いていないという結論に達しました。 Httpで得られるものに固執したい。
しかし、動作させるのに問題があります。このプロパティに指定する値に関係なく、<!>#8217; tが応答で返されません。
私のサービスメソッドは次のようになります
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 Development Server / 9.0.0.0
日付:2009年1月7日水曜日14:01:20 GMT
X-AspNet-Version:2.0.50727
Cache-Control:private
コンテンツの長さ:0
接続:閉じる
クライアントの正しいプロパティにアクセスする必要があるだけではありません。情報は単にリンクを介して送信されていません。
この<=>プロパティは実際に何をしますか?
更新
StatusDescriptionプロパティの設定方法がわかりませんでした。最終的にはエラーメッセージをまったく含めず、Httpステータスコードのみを使用しました。サービスのSoapエンドポイントとRestfulエンドポイントの両方を公開することを選択したため、クライアントはどちらを使用するかを選択できます<!>#8211;シンプルな落ち着いたメッセージまたは比較的リッチなSoapメッセージ。
解決
適切な応答コードを送信すると、応答の本文にカスタムエラーメッセージを提供できます。
他のヒント
.net 4では、 < code> WebFaultException&lt; T&gt; (T errorDetail、
HttpResponseCode
code)
ここでは、応答タイプを別のオブジェクトタイプに設定します。これは理にかなっています。また、必要な ResponseCode
を設定します。
errorDetail
はシリアル化可能でなければなりません
上記のように(ステータスの説明に)エラーコードを追加し、RESTサービスの返されたページの本文に次のように追加します。
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;
を参照同様の質問については、このスレッドをご覧ください。
簡単に言えば、HTTPステータスコードを(エラーコードの1つに)設定し、 StatusDescription プロパティ:
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";
残念ながら、現実世界でのこの手法の普及についてはあまり知りません。
これは欠陥の可能性があります。 2011年9月22日の時点で、この問題は製品チームによって審査中です。