Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何拦截WCF故障并返回自定义响应?_Wcf_Exception Handling - Fatal编程技术网

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

如何拦截WCF故障并返回自定义响应?,wcf,exception-handling,Wcf,Exception Handling,考虑以下非常基本的WCF服务实现: public enum TransactionStatus { Success = 0, Error = 1 } public class TransactionResponse { public TransactionStatus Status { get; set; } public string Message { get; set; } } [ServiceContract] [XmlSerializerForm

考虑以下非常基本的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友好的SOAP异常。这将确保客户端和服务器之间的通道没有出现故障,例如,此调用失败后仍可使用


我不明白你为什么要“捕捉”SOAP错误并将其转换为其他错误,尽管。。。。我也不知道WCF会给你什么支持。基本假设是:捕获.NET异常并将其转换为可互操作的SOAP错误

这里有一个场景:有时您必须为一个企业提供服务,该企业对其服务规范做出了奇怪的决定(例如,将整个重要数据作为XML字符串返回)他们通常期望您永远不会抛出任何SoapFault,而是返回带有错误代码的内容。这种情况首先把我带到了这里:确切地说,我的情况是:(