WCFのWebGet属性を使用するときにどのようにHTTPエラーをキャッチしますか?

.net http rest wcf

私は[WebGet]属性を使ってWebサーバー上のREST APIを問い合わせています。 たびたび(APIはまだ開発中のため)、必要なXMLではなくHTTP / 500エラーの形式でHTML文書が返されます。

これが私の運用契約の例です。

[WebGet(UriTemplate = "検索/?api_key = {キー}
[OperationContract]
XElement Find(文字列キー、文字列クエリ);
  1. and here’s how I call it:

var factory = new WebChannelFactory(new Uri( "http://api.example.com")); var channel = factory.CreateChannel(); var results = channel.Find(myApiKey、 "foo");

エラーが発生した場合、 “results”は最終的にこのXMLを含むXElementになります。

500内部サーバーエラー

XMLが返される前に500エラーをキャッチして、チャネルに例外などをスローさせる方法はありますか? それとも、期待するXMLがそこにあることを確認するために毎回results変数をチェックしなければならないのでしょうか?

  1  0


ベストアンサー

いいえ、あなたが本当に持っているのはHTTPだけなので、本当に例外やSOAPフォルトをスローすることはできません。 そのため、あなたのサービスが失敗した場合、それをHTTPクライアントに伝える唯一の方法はHTTPステータスコードを使うことです。

あなたはコードをもっと意味のあるものにすることを試みることができます。 常に500を返すのではなく、より詳細に分割するか、(少なくとも開発とテストのために)もっと説明的なエラーメッセージを含めることで、問題を解決するためのヒントを得ることができます。

しかし、基本的なメカニズムは次のとおりです。GETにはHTTPのみを使用し、ステータスとエラーコードを返すにはHTTPだけを使用します。

マーク

3


あなたがサーバー上のステータスコードをエラーコードに設定するならば、私はクライアントがそれを例外にマッピングすることを期待するでしょう。 System.Net.HttpWebRequestが400または500シリーズのステータスコードを取得した場合、クライアントでWebExceptionをスローします。

サーバー側ですべてのサービス実装メソッドにtry catchブロックを追加したくない場合は、System.ServiceModel.Webが提供する標準エラーハンドラーを置き換える必要があります。

デフォルトのエラーハンドラが適用されないようにするために、新しい派生WebHttpBehaviourを作成し、AddServerErrorHandlersをオーバーロードすることによってこれを行うコードがあります。 次に、IServiceBehaviorを実装する新しいビヘイビアーでApplyDispatchBehaviorを使用してステータスコードを設定するエラーハンドラーを追加する必要があります。

おそらくもっと簡単な方法があります。 WCFで同じ猫をスキニングする方法は1001通りあるようです。

2


タイトルとURLをコピーしました