4

カスタム例外を FaultException として送信する方法について質問があります。ArgumentException のようなシステム例外を使用すると機能しますが、カスタム例外「TestException」に変更すると失敗します。サービス参照を追加しようとしても、その構成を取得できません。

作品:

[OperationContract]
[FaultContract(typeof(ArgumentException))]
[TransportChannel TestMethod ();


public Void TestMethod()
{
            throw new FaultException<ArgumentException>(new ArgumentException("test"), new FaultReason("test"));
}

動作しません:

[OperationContract]
[FaultContract(typeof(TestException))]
[TransportChannel TestMethod ();


public Void TestMethod()
{
            throw new FaultException<TestException>(new TestException("test"), new FaultReason("test"));
}

私の「TestException」は次のようになります。

[Serializable()]
public class TestException: Exception
{
    public TestException () : base() { }
    public TestException (string message) : base(message) { }
    public TestException (string message, Exception innerException) : base(message, innerException) { }
    public TestException (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}

カスタム オブジェクトに DataContract を追加する必要があると思いますが、ArgumentException が機能するため、そのままでは機能しない理由がわかりません。誰かが私を啓発できますか?

手伝ってくれてありがとう :)

4

2 に答える 2

7

このページで説明されているように、[DataContract] でマークする必要があります: http://msdn.microsoft.com/en-us/library/ms576199.aspx

ArgumentException はワイヤーの両側で知られているため (両側で .NET を使用していると仮定して) 動作すると想定しています (ただし、確かなことはわかりません)。例外を DataContract として宣言しないと、DataContractSerializer によって正しく記述およびシリアル化/逆シリアル化することはできません。

于 2011-04-19T13:53:41.920 に答える
0

確かに DataContract としてマークする必要があります。これは、相手側 (クライアント) が知らないカスタム タイプです。

于 2011-04-20T07:34:13.590 に答える