考虑以下非常基本的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中执行这种操作?