ってエラー詳細から、WCF休み
-
22-09-2019 - |
質問
していまRESTサービスを消費する。Net WCFます。
時にエラーが検出された他のサービスを返しますHTTP400悪い要求に対応本体を含むJSON serialisedます。
い求用フィドラーズがあり、Javascriptから直接C#できます簡単アクセスし、レスポンス-ボディがエラーが発生します。
しかし、私が使っているピ ChannelFactory
6非常に複雑なインタフェースにスローされる例外ですよこの代理人が常に ProtocolException
, ない有用です。
あのようなレスポンス-ボディが取得します。
更新
かかわる問題と理解があること負荷の違いめんなさい。益となることができることその他の方法の誤差に応じます。いに役立つかわからない答えないこの質問です。
のサービスしていますの変更を行う際には、複雑なタの取得を更新しました。を使用 ChannelFactory
の新しいインターフェイスいる、ということを意味していただくコンパイル時には実行時例外は、これらの多くの維持-更新しています。
あのようなレスポンス-ボディのためのエラーレスポンスのHTTPステータス利用の場合は、WCFチャンネル?
解決
のChannelFactoryを使用しないでください:-)真剣にかかわらず。なぜあなたは、RESTインターフェースを作成し、WCFクライアントプロキシを使用します。 RESTサービスを使用する利点は何ですか?理由だけではなく、wsHttpBindingを使わないのでしょうか? RESTスターターキットからのHttpClientクラスを使用すると、標準のHTTP要求を行い、その後、DataContractSerializerを使用して応答をデシリアライズすることができます。
例えばます。
var httpClient = new HttpClient();
var content = httpClient.Get("http://example.org/customer/45").Content;
var customer = content.ReadAsDataContract<Customer>()
他のヒント
あなたは以下のように例外の詳細を取得することができます:
Exception innerException = exception.InnerException;
WebException webException = innerException as WebException;
HttpWebResponse response = webException.Response as HttpWebResponse;
string statusDescription = response.StatusDescription;
HttpStatusCode statusCode = response.StatusCode;
InnerException
のProtocolException
はWebException
になります。
あなたはそれからHttpWebResponse
を取得し、実際のレスポンスボディを読み込むためにGetResponseStream
を呼び出すことができます。 (読む前に、ストリームの先頭に求めることを忘れないでください)。
var webException = (WebException) protocolException.InnerException;
var response = (HttpWebResponse) webException.Response;
var responseStream = response.GetResponseStream()
responseStream.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(responseStream);
var responseContent = reader.ReadToEnd();
あなたはサービスからのWebProtocolExceptionのを投げてみてください。この方法では、エラーの詳細は、HTTPレスポンスのボディに含まれるべきです。この記事を見てます:
WCF REST&効果的なエラー処理>
私の2セントは、WCFは、多くの異なるバインディングを使用して、同じクラスをさらすのが得意であるということです。 C#と通信するとき、それは例外情報に良好であるSOAPバインディングを使用します。あなたはバインディングRESTスタイルを使用しなければならない場合は、サービスを呼び出し、結果をデシリアライズするためにJSONシリアライザを使用するように簡単なWebRequestクラスを使用することができます。これはまた、あなたの応答コードに直接アクセスできるようになります。
のアプローチは、私のためuser653761作品で記述しました。 HttpWebResponse
オブジェクトへのアクセスを持った後、私はこのようなDataContractSerializer
クラスを使用することができます:
var serializer = new DataContractSerializer(typeof(MyDataContractType));
var deserialized =
(serializer.ReadObject(httpWebResponse.GetResponseStream()) as MyDataContractType);
// ...
私は、これはあなたが右のシリアライザを使用する場合、WCFはシリアライズできることを何のために働くだろうと思い、パフォーマンスのためにテストしていない(まだ)。