質問

していま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;

InnerExceptionProtocolExceptionWebExceptionになります。 あなたはそれから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はシリアライズできることを何のために働くだろうと思い、パフォーマンスのためにテストしていない(まだ)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top