FaultException и пользовательское исключение WCF - PullRequest
4 голосов
/ 19 апреля 2011

У меня есть вопрос о том, как отправить пользовательское исключение как 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 работает. Может ли кто-нибудь просветить меня?

Спасибо за помощь:)

Ответы [ 2 ]

7 голосов
/ 19 апреля 2011

Вам нужно пометить его с помощью [DataContract], как описано на этой странице: http://msdn.microsoft.com/en-us/library/ms576199.aspx.

Я предполагаю (но не знаю точно), что ArgumentException работает, потому что он известен с обеих сторонпровода (при условии, что вы используете .NET на каждой стороне).Без объявления вашего исключения как DataContract, оно не может быть правильно описано и сериализовано / десериализовано DataContractSerializer.

0 голосов
/ 20 апреля 2011

Вам обязательно нужно пометить его как DataContract. Это пользовательский тип, который другая сторона (ваш клиент) не знает.

...