2011-06-10 34 views
3

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

回答

6

查看WCF IErrorHandler接口 - 它允许您在服务实现中集中定义一种方法,以捕获所有异常并吞下它们,或将它们转换为适合WCF的SOAP异常。这将确保客户端与服务器之间的通道没有故障,例如在通话失败后仍然可以使用。

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

+0

这里有一个场景:有时候,你必须为它承担了他们的服务规范怪异决定一个企业服务(例如返回作为一个整体的重要数据XML字符串),他们通常希望你永远也不会引发任何的SOAPFault但与返回一个错误代码的东西。这种情况布拉夫我在这里摆在首位:对 – user1778770 2014-06-25 17:09:28

+0

谁的人说:“我不明白你为什么会想”应该找到一个真正的工作。 – 2017-08-29 11:35:10