Моя служба WCF в C # выглядит следующим образом.
[ServiceContract]
public class MySecretService
{
[OperationContract]
[FaultContract(typeof(ErrorMessage))]
public MyDTO ReturnMyDTOMethod(int id, out string errorMessage)
{
try
{
//Do stuff...
//Do some more stuff... pseudocode
if (biz rule 1 && etc)
{
return MyDTO;
}
else if (biz rule 2 && etc)
{
return null;
}
else
{
throw new FaultException<ErrorMessage>(blah etc..)
}
}
catch (Exception e)
{
throw new FaultException<ErrorMessage>(blah etc...);
}
}//end-method
}//end-class
DTO, возвращаемый методом, выглядит следующим образом:
[DataContract]
public class MyDTO
{
[DataMember]
public XElement XmlRep
{
get
{
//do something within setter, etc...
//error occurs prior to returnin from setter, where to i catch it?
return _xmlRep
}
set
{
_xmlRep = value;
}
}
}
Типичные примеры, которые я обнаружил, показывают бросаниеFaultException изнутри метода;Но в моем случае мой метод не является ошибкой;Ошибка возникает в тот момент, когда объект возвращается клиенту / потребителю;т.е. когда сериализуется DataMember / Property XmlRep;
Так что я не могу поместить исключение FaultException в свой метод;Но я все еще хочу не получить «Базовое соединение было закрыто: соединение было неожиданно закрыто».и выдать правильную ошибку, которая возникает в геттере.
Я не пытался поместить try / catch в геттер MyDTO, НИКТО Я ХОЧУ, ПОТОМУ ЧТО я хочу, чтобы мой DTO был настолько простым, насколько это возможно, и знаю,ничего о FaultExceptions и вещах WCF.Любые другие идеи?
РЕДАКТИРОВАТЬ: просто чтобы прояснить это, я знаю, что ошибка происходит в Getter MyDto DataContract;Но где еще я мог бы выбросить FaultException, учитывая, что внутри Getter мне кажется изворотливым местом для его выброса?
EDIT # 2: я реализовал обработчик ошибок для всех целей на стороне службы, как это было предложеноТим ниже (используя IErrorHandler);это не работает в моем конкретном случае.Я думаю, что это потому, что ошибка не возникает в OperationContract ReturnMyDTOMethod (), а вместо этого в MyDto при сериализации;Другими словами, кажется, что лошадь заперта (метод успешно завершен), и IErrorHandler уже может оказаться полезным - в частности, ProvideFault () не запускается, но HandleError () запускается.Следовательно, я по-прежнему получаю сообщение о нарушении канала, которое требует от меня возврата на чертежную доску - т.е. убедитесь, что MyDto не делает ничего необычного, например, генерирует ошибку!