WCF перехватывает настраиваемое исключение FaultException

Я хочу использовать custom FaultException как это

 [DataContract]
public class Fault
{
    [DataMember]
    public string Message { get; set; }
}

public class MyFault<T>:FaultException<T> where T : Fault
{
     public MyFault(T faultClass)
        : base(faultClass, new FaultReason(faultClass.Message))
    {

    }
}

...

throw new MyFault<Fault>(new Fault {Message = "hello"});

...

Интерфейс

[OperationContract]
[FaultContract(typeof(Fault))]
string GetData2(int value);

но когда он попадает к клиенту, он преобразуется в FaultException

      try
        {
            var res = serv.GetData2(1);
        }
        catch (MyFault<WcfService1Sample.Fault> ex)
        {
            label1.Text = ex.Reason.ToString(); //-> i want here
        }
        catch (FaultException<ServiceReference1.Fault> ex)
        {
            label1.Text = ex.Reason.ToString(); //-> catch here
        }
        catch (Exception)
        {

            throw;
        }

могу ли я поймать нестандартную ошибку на клинте? или WCF автоматически преобразует его в FaultException, как мне заставить эту проблему работать

спасибо kfir


person kfir    schedule 29.08.2012    source источник
comment
Ваш Fault класс должен иметь атрибут DataContract, а свойство Message должно быть DataMember.   -  person anton.burger    schedule 29.08.2012
comment
Вы правы, я забыл поставить данные контракта. но даже если я добавлю его, он не работает, я хочу, чтобы он работал.   -  person kfir    schedule 30.08.2012


Ответы (1)


Думаю, есть две проблемы. Первый:

  • What shambulator said: Your custom Fault class must be
    • a DataContract, and use
    • DataMember для обозначения всех свойств, которые должны быть сериализованы.

Если это будет сделано, WCF будет

  • преобразуйте throw new FaultException<MyFault>(new MyFault { ... }); на стороне службы в сообщение, содержащее вашу ошибку, включая данные; а также
  • преобразуйте эту ошибку на стороне клиента в FaultException<MyFault>.

Второй:

Этот клиентский FaultException<> создается WCF. Возможно, можно зарегистрировать собственный переводчик исключений, но я никогда им не пользовался, никогда не нуждался в нем и не нашел ничего подобного после минутного поиска в Google. Я бы рекомендовал просто использовать FaultException плюс настраиваемый тип неисправности.

person gimpf    schedule 29.08.2012
comment
Благодарю. Вы правы, я ищу больше, чем мин, я гуглил и мог найти его, поэтому я публикую его. вы, возможно, правы, я мог бы использовать обычное FaultException - person kfir; 30.08.2012