私は WCF を使い始めたばかりで、JSON と XML の両方をサポートする WCF レスト サービスで障害処理を検証しようとしています。私のテスト サービスはエラーを生成しますが、何を試しても、クライアントにエラーの詳細を取得させることができません (動作は、要求の形式と HTTP ステータス コードによって異なります)。
私のテスト サービスは、次のようにエラーを生成します。
public Data GetResponse()
{
throw new WebFaultException<ErrorDetails>(
new ErrorDetails {ErrorMessage = "Server Config Value not set"},
HttpStatusCode.OK
);
}
これは非常に合理的にネットワークを介して送信されます。
{"ErrorMessage":"Server Config Value not set"}
と:
<ErrorDetails xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorMessage>Server Config Value not set</ErrorMessage>
</ErrorDetails>
私のクライアントは次のように定義されていますFaultContract
:
[OperationContract]
[WebInvoke(
UriTemplate="/response",
Method="GET",
RequestFormat = WebMessageFormat.Xml, // or .Json
ResponseFormat = WebMessageFormat.Xml // or .Json
)]
[FaultContract(typeof(ErrorDetails), Namespace="")]
Data GetResponse();
(フォーマット/ステータス コード) の完全なエラー メッセージは次のとおりです。
XML/競合:
応答を要求しています CommunicationException: リモート サーバーが予期しない応答を返しました: (409) Conflict., System.Collections.ListDictionary Internal, System.ServiceModel.ProtocolException Press a key to exit...
XML/OK:
要求応答例外: DataContractSerializer を使用して、ルート名 'ErrorDetails' およびルート名前空間 '' (操作 'GetResponse' および d コントラクト ('IClient', '') の場合) を持つ XML 本体を逆シリアル化できません。XML に対応するタイプが、サービスの既知の n タイプ コレクションに追加されていることを確認してください。System.Collections.ListDictionaryInternal Press a key to exit...
JSON/競合:
応答を要求しています CommunicationException: リモート サーバーが予期しない応答を返しました: (409) Conflict., System.Collections.ListDictionary Internal, System.ServiceModel.ProtocolException Press a key to exit...
JSON/OK:
応答を要求しています 応答: 要求が完了しました 終了するにはキーを押してください...
クライアント コードは、適切な順序で例外をキャッチします。
try
{
Console.WriteLine("Requesting response");
Console.WriteLine("Response: " + client.GetResponse().Message);
Console.WriteLine("Request complete");
}
// sanity check, just in case...
catch (WebFaultException<ErrorDetails> ex)
{
Console.WriteLine("WebFaultException<ErrorDetails>: " + ex.Detail.ErrorMessage + ", " + ex.Reason);
}
catch (FaultException<ErrorDetails> ex)
{
Console.WriteLine("FaultException<ErrorDetails>: " + ex.Detail.ErrorMessage + ", " + ex.Reason);
}
catch (FaultException ex)
{
Console.WriteLine("FaultException: " + ex.Message + ", " + ex.Reason);
}
catch (CommunicationException ex)
{
Console.WriteLine("CommunicationException: " + ex.Message + ", " + ex.Data + ", " + ex.GetType().FullName);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message + ", " + ex.Data);
}
FaultException<ErrorDetails>
スローされてにアクセスできるようにするには、どうすればよいErrorDetails
ですか?
注: Gistは完全にコンパイル可能で実行可能でなければなりません。