3

これが私が理想としてやりたいことです

    public void AfterReceiveReply(ref Message reply, object correlationState) 
    {
        if (reply.IsFault)
        {
            FaultException exp = reply.GetBody<FaultException>();
            if (exp.Code.Name == "MyFaultCode")
            {
               //Do something here
            }
        }
    } 

しかし、私はこの例外を受け取ります

行 1 位置 82 のエラー。名前空間 ' http://schemas.datacontract.org/2004/07/System.ServiceModel ' からの要素 'FaultException' が必要です.. 名前 'Fault'、名前空間 ' http:/ /schemas.xmlsoap.org/soap/envelope/ '.

やろうとすると

FaultException exp = reply.GetBody<FaultException>();

サーバー側からは、これが例外をスローする方法です。

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext             
                                  instanceContext)
{
    throw new FaultException("MyFaultCode", new FaultCode("MyFaultCode"));
}

FaultCode にアクセスできるように、メッセージから Fault Exception を逆シリアル化する方法を教えてください。

4

3 に答える 3

2

System.ServiceModel.Channels.Message クラス (ここではメッセージ変数) から直接障害情報を抽出できます。

var fault = MessageFault.CreateFault(message, int.MaxValue);

次に、この障害から、障害コードまたはメッセージを読み取ることができます。

var error = fault.Reason.GetMatchingTranslation().Text;

要約すると、単純な検証メソッドを作成できます。

private static void ValidateMessage(Message message)
    {
        if (!message.IsFault) return;
        var fault = MessageFault.CreateFault(message, int.MaxValue);
        var error = fault.Reason.GetMatchingTranslation().Text;
        //do something :)
    }
于 2015-07-27T09:54:33.830 に答える
0

.NET にその型が組み込まれているかどうかはわかりませんが、自分で生成する方法は次のとおりです。

  1. ダウンロードhttp://schemas.xmlsoap.org/soap/envelope/
  2. 次のコマンドを実行します。

    svcutil /dconly /importxmltypes envelope.xml
    

しかし、それは本当にあなたの「やりたいこと」ですか?

その FaultException がサーバーであるとスローしている場合、クライアントで直接キャッチできるはずではありませんか?

または、操作コントラクトでFaultContract属性を使用して、カスタムのエラー例外を処理します。

于 2013-06-17T12:34:55.050 に答える