WCF 服务中的异常

Posted

技术标签:

【中文标题】WCF 服务中的异常【英文标题】:Exceptions in WCF services 【发布时间】:2017-06-13 01:08:57 【问题描述】:

我的ServiceBase 抽象类中有以下代码:

    internal ServiceResponse ExecuteNonQuery(Action action)
    
        try
        
            action();
            return new ServiceResponse()  IsFaulty = false ;
        
        catch (DbEntityValidationException e)
        
            OnDbEntityValidationException(e);
            return new ServiceResponse()  IsFaulty = true, Exception = e;
        
        catch (Exception e)
        
            _logger.Log(e);
            return new ServiceResponse() IsFaulty = true, Exception = e;
        
    

我的所有服务都派生自此类,我的 WCF 服务端点如下所示:

    public ServiceResponse Add(Client client)
    
        _logger.LogInformation($"ClientService.Add()");
        return ExecuteNonQuery(() =>
        
            using (var context = _contextFactory.Build())
            
                context.Clients.Add(_serviceToDalMapper.Map(client));
                context.SaveChanges();
            
        );
    

在客户端调用我的服务时,我有类似的 Try/Catch 方法。

我不明白的是,当服务端抛出异常时,异常被捕获,但我仍然在客户端得到一个System.ServiceModel.CommunicationException。为什么 ?我发现了我的异常,我的服务不应该只返回ServiceResponse吗?

【问题讨论】:

可能在catch块内抛出异常 【参考方案1】:

在当前的catch 中添加try-catch,看起来调用正在生成异常,可能在catch 中生成。

 catch (DbEntityValidationException e)
 
      try
      
        OnDbEntityValidationException(e);
        return new ServiceResponse()  IsFaulty = true, Excepetion = e;
      
      catch
      
        return new ServiceResponse()  IsFaulty = true, Excepetion = new Exception("Error handling the error");   
      
 

【讨论】:

显然 WCF 无法序列化异常,这是我尝试将异常发送回客户端时的问题... thx @EmmanuelIstace 也许你应该检查一下 FaultContract ***.com/questions/5717231/… 谢谢,在寻找我得到异常的原因时,我发现了 FaultContract 属性,因为这似乎是一个最佳实践,我将在未来使用它:) 对于您希望客户端能够处理的异常,使用 FaultContract 当然是一种很好的做法。但是对于其他技术异常,您可以让异常从您的服务方法传播。您还可以实现 System.ServiceModel.Dispatcher.IErrorHandler(特别是 ProvideFault 方法)以将异常包装在更友好的 FaultException 中。【参考方案2】:

WCF 无法序列化 Exception 对象(这在某种程度上是有意义的)。

所以在我的 catch 块中抛出了一个异常,这就是这里的错误。

根据 WCF 最佳实践,我应该使用 FaultContract 将异常传达给客户端。

【讨论】:

以上是关于WCF 服务中的异常的主要内容,如果未能解决你的问题,请参考以下文章

WCF RESTFul服务中的异常处理

WCF REST 完整服务中的异常处理

抛出异常:尝试调用 WCF 服务时 mscorlib.dll 中的“System.IO.FileNotFoundException”

带有用户名身份验证的 WCF 中的异常

找不到端点异常 - WCF Web 服务

找不到端点异常 - WCF Web 服务