13

私はサードパーティのソープ サービスとうまく連携しています。クラスを自動生成した SOAP Web サービスへのサービス参照を追加しました。

エラーが発生すると、次のような SOAP 応答が返されます。

<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring xsi:type="xsd:string">Error while reading parameters of method 'Demo'</faultstring>
         <detail xsi:type="xsd:string">Invalid login or password. Connection denied.</detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

エラーをキャッチできますが、詳細を抽出できません。私は次のコードを試しました:

catch (FaultException ex)
{
    MessageFault msgFault = ex.CreateMessageFault();
    var elm = msgFault.GetDetail<string>();
    //throw Detail
}

ただし、詳細ノードはオブジェクトではないため、次のエラーが発生します。

Expecting element 'string' from namespace 'http://schemas.datacontract.org/2004/07/MyDemoNamespace'.. Encountered 'Text'  with name '', namespace ''.

これはサード パーティの API であるため、応答を変更することはできません。

4

5 に答える 5

2

以下は、FaultException の詳細要素の値を示します。

var faultMessage = faultException.CreateMessageFault();
if(faultMessage.HasDetail){
  Console.Write(faultMessage.GetDetail<XElement>().Value);
}
于 2015-10-30T10:26:28.500 に答える
2
   public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {

        if (reply.IsFault)
        {
            // Create a copy of the original reply to allow default WCF processing
            MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
            Message copy = buffer.CreateMessage();  // Create a copy to work with
            reply = buffer.CreateMessage();         // Restore the original message 

            MessageFault faultex = MessageFault.CreateFault(copy, Int32.MaxValue); //Get Fault from Message
            FaultCode codigo = faultex.Code;
            //if (faultex.HasDetail)... //More details

            buffer.Close(); 
于 2015-05-13T07:59:01.793 に答える