В моем недавнем проекте (службы WCF REST) я использую WebServiceHostFactory , и я все еще смог достичь этого с помощью IErrorHandler .Ниже приведен пример
. Я создал класс ExceptionInfo, который можно сериализовать и отправить обратно клиенту.
[Serializable]
public class ExceptionInfo
{
public string ExceptionType { get; set; }
public string ExceptionMessage { get; set; }
public string StackTrace { get; set; }
}
И реализовать собственный обработчик ошибок
[DataContract]
public class MyCustomServiceErrorHandler : IErrorHandler
{
#region IErrorHandler Members
/// <summary>
/// This method will execute whenever an exception occurs in WCF method execution
/// </summary>
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
var exceptionInfo = new ExceptionInfo();
if (error is MyCustomException)
exceptionInfo.ExceptionType = error.Type.ToString();;
else
exceptionInfo.Type = "Unhandled Exception";
exceptionInfo.ExceptionMessage = error.Message;
exceptionInfo.StackTrace = error.StackTrace;
var faultException = new FaultException<ExceptionInfo>(exceptionInfo);
object detail = faultException.GetType().GetProperty("Detail").GetGetMethod().Invoke(faultException, null);
fault = Message.CreateMessage(version, "", detail, new DataContractSerializer(detail.GetType()));
var webBodyFormatMessageProp = new WebBodyFormatMessageProperty(WebContentFormat.Xml);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, webBodyFormatMessageProp);
var httpResponseMessageProp = new HttpResponseMessageProperty();
httpResponseMessageProp.Headers[HttpResponseHeader.ContentType] = "application/xml";
httpResponseMessageProp.StatusCode = HttpStatusCode.BadRequest;
httpResponseMessageProp.StatusDescription = exceptionInfo.ExceptionMessage;
fault.Properties.Add(HttpResponseMessageProperty.Name, httpResponseMessageProp);
}
/// <summary>
/// Performs error related behavior
/// </summary>
/// <param name="error">Exception raised by the program</param>
/// <returns></returns>
public bool HandleError(Exception error)
{
// Returning true indicates that an action(behavior) has been taken (in ProvideFault method) on the exception thrown.
return true;
}
Теперь вы можете украсить свои службы с помощью вышеуказанного обработчика.
[ServiceContract]
[ServiceErrorBehavior(typeof (MyCustomServiceErrorHandler))]
public class LoginService : ServiceBase
{}
На стороне клиента вы можете проверить, является ли HttpStatusCode ответа! = Ok, и десериализовать ответ для типа ExceptionInfo и отобразить его в окне сообщенияили справиться с требованием.
Надеюсь, это поможет.