如何拦截WCF故障并返回自定义响应?

5

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

1个回答

7
请查看WCF IErrorHandler接口 - 它允许您在服务实现中集中定义一种方法来捕获所有异常并将其吞噬或转换为WCF友好的SOAP异常。这将确保客户端和服务器之间的通道没有故障,例如,在此调用失败后仍然可以使用它。
不过,我不明白为什么你想要“捕获”SOAP故障并将其转换为其他东西......也不知道WCF会给你什么支持。基本假设是:捕获.NET异常并将其转换为可互操作的SOAP故障。

1
这里有一个场景:有时您必须为企业提供服务,而该企业在其服务规范上做出了奇怪的决定(例如将整个重要数据作为XML字符串返回),并且他们通常希望您永远不会抛出任何SoapFault,而是返回带有错误代码的内容。这种情况首先让我来到这里:p - user1778770
1
正是我遇到的情况 :'( - George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接