Рассмотрим следующую очень базовую реализацию службы WCF:
public enum TransactionStatus
{
Success = 0,
Error = 1
}
public class TransactionResponse
{
public TransactionStatus Status { get; set; }
public string Message { get; set; }
}
[ServiceContract]
[XmlSerializerFormat]
public interface ITestService
{
[OperationContract]
TransactionResponse DoSomething(string data);
}
public class TestService : ITestService
{
public TransactionResponse DoSomething(string data)
{
var result = ProcessData(data); // may throw InvalidOperationException
return new TransactionResponse()
{
Status = TransactionStatus.Success,
Message = result
};
}
private string ProcessData(string data)
{
if (data = "foobar")
throw new InvalidOperationException();
return data;
}
}
В том случае, если метод DoSomething вызывает исключение InvalidOperationException, я хотел бы перехватить ошибку и вернуть объект TransactionResponse, а не WCFподнять FaultException с клиентом.Как я могу сделать это, не окружая тело каждого метода огромным оператором try catch?Есть ли где-нибудь, где я могу подключиться?Могу ли я сделать это с каким-то атрибутом или чем-то?Пример того, как я хотел бы справиться с этим, можно продемонстрировать с помощью ASP.NET MVC:
public class ApiController : BaseController
{
protected override void OnException(ExceptionContext filterContext)
{
var ex = filterContext.Exception;
var message = HttpContext.IsDebuggingEnabled ? ex.ToString() : ex.Message;
_logger.Error("Error processing request for controller {0}, action {1}",
filterContext.RequestContext.RouteData.Values["controller"],
filterContext.RequestContext.RouteData.Values["action"]);
_logger.Error(ex.ToString());
filterContext.ExceptionHandled = true;
filterContext.Result = ToXml(new ApiResult(false)
{
Message = message
});
}
// ...
}
Используя описанный выше метод в MVC, я могу убедиться, что независимо от того, какое действие контроллера выдает исключение, я могуобработайте его и верните соответствующий формат ActionResult, содержащий необходимую информацию.Есть ли способ сделать это с WCF?