Web サービスに接続していますが、返されるエラー メッセージは (まったく) デシリアライズされておらず、作成できるクラスのバージョンは正しくデシリアライズされません。サーバー側のことは制御できません。サーバーは検出を許可しないため、?WSDL をエンドポイントの URL の末尾に追加すると、WSDL ではなくエラーになります。
[Fiddler][1] は、Fault メッセージが次のように戻ってくることを示しています。
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:eGov="http://eGov.gov" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>Client</faultcode>
<faultstring/>
<detail>
<eGov:eGov2Exception>
<eGov:ErrorClassification>SOME_ERROR</eGov:ErrorClassification>
<eGov:ErrorCode>SOME_ERROR_CODE</eGov:ErrorCode>
<eGov:ErrorMessage>Your request was unsuccessful. blah blah blah.</eGov:ErrorMessage>
</eGov:eGov2Exception>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
しかし、作成したクラス (xsd.exe、svcutil など、ゼロから作成したコードを含む) は、次のコマンドでキャッチしようとすると、逆シリアル化できません。
catch (FaultException<eGov2ExceptionType> exp)
{
// Never stops here.
}
catch (FaultException<AllOtherAttemptedClasses> exp)
{
// Never stops here.
}
catch (SoapException se)
{
// Never stops here.
}
catch (FaultException exp)
{
//Always gets caught here.
}
ベースの FaultException キャッチのみが呼び出されます。つまり、送信された FaultMessage の内容が失われます。私が作成したいくつかのクラスは、上記のサンプルに非常に近い形でシリアル化されますが、逆シリアル化に失敗するため、名前空間に問題があるのではないかと考えられます。
質問:
1 - これはどのように書きますか?
2 - これは WCF の一般的なエラー/問題ですか?
[1]: http://www.fiddler2.com/fiddler2/フィドラー