【问题标题】:Exception Handling in WCF's Completed EventWCF 的 Completed 事件中的异常处理
【发布时间】: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;
    }
}

【问题讨论】:

    标签: c# wcf silverlight exception-handling


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多