考虑下面非常基本的WCF服务实现:如何截获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来做这种事情?
这里有一个场景:有时候,你必须为它承担了他们的服务规范怪异决定一个企业服务(例如返回作为一个整体的重要数据XML字符串),他们通常希望你永远也不会引发任何的SOAPFault但与返回一个错误代码的东西。这种情况布拉夫我在这里摆在首位:对 – user1778770 2014-06-25 17:09:28
谁的人说:“我不明白你为什么会想”应该找到一个真正的工作。 – 2017-08-29 11:35:10