Ваша служба должна обработать все исключения и включить их в FaultException , где T - это контракт на данные, который вы написали. Поэтому первым шагом является определение пользовательского контракта данных, который будет содержать информацию об исключении:
[DataContract]
public class CustomFault
{
public string Message { get; set; }
}
Затем вы указываете своему контракту на обслуживание, что его методы потенциально могут вызвать FaultException . Это позволяет службе предоставлять класс CustomFault в wsdl, чтобы клиенты могли генерировать прокси-класс:
[ServiceContract]
public interface IMyServiceContract
{
[FaultContract(typeof(CustomFault))]
void MyMethod(string someArgument);
}
Следующим шагом является реализация этого интерфейса:
public class MyService : IMyServiceContract
{
public void MyMethod(string someArgument)
{
// Do something here that could throw exceptions but don't catch yet
}
}
Для обработки исключений вы можете реализовать IErrorHandler , который будет использоваться всякий раз, когда один из ваших методов обслуживания выдает исключение. Цель этого обработчика ошибок - заключить исключение в FaultException :
public class MyErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message msg)
{
var customFault = new CustomFault()
{
Message = error.Message,
};
var fe = new FaultException<CustomFault>(customFault);
MessageFault fault = fe.CreateMessageFault();
string ns = "http://somenamespace/whatever";
msg = Message.CreateMessage(version, fault, ns);
}
}
Как только вы зарегистрируете свой обработчик ошибок, на стороне клиента вы всегда получите FaultException .