如何拦截 WCF 错误并返回自定义响应?

2024-01-04

考虑以下非常基本的 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来做这种事情?


查看WCF IErrorHandler http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx接口 - 它允许您在服务实现中集中定义一种方法来捕获所有异常并吞掉它们,或者将它们转换为 WCF 友好的 SOAP 异常。这将确保客户端和服务器之间的通道不会出现故障,例如本次调用失败后仍然可以使用。

我不明白为什么您想要“捕获”SOAP 错误并将其转换为其他内容,但是......我也不知道 WCF 会给您提供任何支持。基本假设是:捕获 .NET 异常并将其转换为可互操作的 SOAP 错误

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何拦截 WCF 错误并返回自定义响应? 的相关文章

随机推荐