9

.Net WCF クライアントによって消費される REST サービスがあります。

エラーが発生すると、REST サービスは HTTP 400 Bad Request を返し、応答本文には JSON のシリアル化された詳細が含まれます。

Fiddler、Javascript、または C# から直接要求を実行すると、エラーが発生したときに応答本文に簡単にアクセスできます。

ChannelFactoryただし、 6 つの非常に複雑なインターフェイスを持つ WCF を使用しています。このプロキシによってスローされる例外は常に でありProtocolException、有用な詳細はありません。

このエラーが発生したときに応答本文を取得する方法はありますか?


アップデート

.Net を使用してこれを行うにはさまざまな方法があり、エラー応答を取得する方法は他にもあることを認識しています。それらは知っておくと便利ですが、この質問には答えません。

私たちが使用している REST サービスは変更され、複雑なインターフェイスは更新されます。新しいインターフェイスでを使用するChannelFactoryと、(実行時ではなく) コンパイル時に例外が発生し、コードの保守と更新がはるかに簡単になります。

WCF チャネルを使用しているときにエラー HTTP ステータスの応答本文を取得する方法はありますか?

4

6 に答える 6

5

以下のように例外の詳細を取得できます。

                Exception innerException = exception.InnerException;
                WebException webException = innerException as WebException;
                HttpWebResponse response = webException.Response as HttpWebResponse;
                string statusDescription = response.StatusDescription;
                HttpStatusCode statusCode = response.StatusCode;
于 2011-03-10T15:05:22.510 に答える
3

サービスからWebProtocolExceptionをスローしてみてください。このようにして、HTTP 応答の本文にエラーの詳細を含める必要があります。この記事を見てください:

WCF と REST による効果的なエラー処理

于 2010-04-05T14:00:03.503 に答える
1

私の 2 セントは、WCF が多くの異なるバインディングを使用して同じクラスを公開するのに適しているということです。C# と通信する場合は、例外情報に優れた SOAP バインディングを使用します。REST スタイルのバインディングを使用する必要がある場合は、単純な WebRequest を使用してサービスを呼び出し、JSON シリアライザーを使用して結果を逆シリアル化できます。これにより、応答コードに直接アクセスすることもできます。

于 2010-04-29T16:03:33.973 に答える
1

user653761 によって説明されたアプローチは私にとってはうまくいきます。HttpWebResponseオブジェクトにアクセスした後、次のDataContractSerializerようにクラスを使用できます。

var serializer = new DataContractSerializer(typeof(MyDataContractType));
var deserialized = 
    (serializer.ReadObject(httpWebResponse.GetResponseStream()) as MyDataContractType);

// ...

これは、適切なシリアライザーを使用し、(まだ) パフォーマンスをテストしていない場合に、WCF がシリアル化できるものすべてに対して機能すると思います。

于 2011-09-30T09:39:43.177 に答える
1

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>()
于 2010-03-25T23:05:52.170 に答える