WCF 的 Completed 事件中的异常处理

Posted

技术标签:

【中文标题】WCF 的 Completed 事件中的异常处理【英文标题】:Exception Handling in WCF's Completed Event 【发布时间】:2016-05-17 16:26:38 【问题描述】:

我想知道如何在我的 WCF's 完成事件方法中捕获异常并在 MessageBox 中将其显示给用户。

我调用了从数据库中获取记录的GetProductTypeAsync(); 方法。我想捕获此处发生的任何异常并将其发送到service_GetProductTypeCompleted 事件,它应该向用户显示Exception Message

public List<ProductType> GetProductType()

    List<ProductType> productType = new List<ProductType>();
    try
    
        using (SqlConnection con = new SqlConnection(_connectionString))
        
            SqlCommand cmd = new SqlCommand("usp_Get_ProductType", con);
            cmd.CommandType = CommandType.StoredProcedure;
            con.Open();
            using (SqlDataReader reader = cmd.ExecuteReader())
            
                while (reader.Read())
                
                    ProductType pType = new ProductType(Convert.ToInt32(reader["pkProductTypeID"]), reader["Name"].ToString());
                    productType.Add(pType);
                
            
        
    
    catch(Exception ex)
    
        //Catch Exception and send to the service_GetProductTypeCompleted Event Method
    
    return productType;
 

这里是service_GetProductTypeCompleted 事件

void service_GetProductTypeCompleted(object sender, GetProductTypeCompletedEventArgs e)

    if (e.Result.Count != 0)
    
        productTypes = e.Result.ToList();
        cboProductType.DataContext = productTypes;
    

【问题讨论】:

【参考方案1】:

当您从您的服务 发送exception 时,客户端将收到一般错误消息:

由于内部错误,服务器无法处理请求。有关该错误的更多信息,请在服务器上打开 IncludeExceptionDetailInFaults(来自 ServiceBehaviorAttribute 或来自配置行为)以便将异常信息发送回客户端,或者根据 Microsoft .NET Framework SDK 文档打开跟踪和检查服务器跟踪日志。”

如果您想在客户端捕获特定异常,那么您应该从服务 中抛出所谓的FaultException。这些是肥皂故障,任何消费者都可以识别。请注意,您的服务使用者并不总是 .NET 使用者,因此无法识别抛出 CLR 异常。这就是为什么你需要throwSoap exception

例如这就是你如何捕捉和抛出Fault Exception

catch (FaultException<AnyTypeThatCanBeSerialized> ex)
        
            throw;
        

阅读this article了解更多关于wcf Faults的详细信息

【讨论】:

【参考方案2】:

FaultException 不会流向 Silverlight。您需要从服务层返回类似于以下内容的类:

public class ServiceReturnInformation<T>

    public T DataContext  get; set; 

    private IList<string> _warnings;
    public IList<string> Warnings
    
        get  return _warnings ?? (_warnings = new List<string>()); 
        set  _warnings = value; 
    

    private IList<string> _errors;
    public IList<string> Errors
    
        get  return _errors ?? (_errors = new List<string>()); 
        set  _errors = value; 
    
  

如果发生异常,您的服务需要捕获异常并设置错误/警告属性。

    var result = new ServiceReturnInformation<Employee>();
    try
    
        // Do something
        result.DataContext = GetEmployee();
    
    catch (Exception ex)
    
        result.DataContext = null;
        result.Errors.Add(ex.Message);
    

    return result;

【讨论】:

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

WCF RESTFul服务中的异常处理

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

WCF 异常处理策略

是否可以通过在 Xaml 中调用来自 ViewModel 的命令的方式来处理 Storyboard.Completed 事件

WCF Web 服务调用 - 要捕获哪些异常?

WCF 服务如何向其客户端引发事件?