代码之家  ›  专栏  ›  技术社区  ›  Huma Ali

WCF已完成事件中的异常处理

  •  0
  • Huma Ali  · 技术社区  · 8 年前

    我想知道如何在我的 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_GetProductType已完成 事件

    void service_GetProductTypeCompleted(object sender, GetProductTypeCompletedEventArgs e)
    {
        if (e.Result.Count != 0)
        {
            productTypes = e.Result.ToList();
            cboProductType.DataContext = productTypes;
        }
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   ANewGuyInTown    8 年前

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

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

    如果你想抓住 特定例外 在客户端,您应该抛出所谓的 FaultException 来自 服务 。这些是 肥皂故障 并且可以被任何人识别 消费者 。请注意,服务的使用者并不总是.NET使用者,因此抛出CLR异常将无法识别。这就是为什么你需要 throw Soap exception .

    E、 这就是你接球和投球的方式 Fault Exception

    catch (FaultException<AnyTypeThatCanBeSerialized> ex)
            {
                throw;
            }
    

    阅读 this article 有关的详细信息 wcf Faults

        2
  •  0
  •   M. Tovbin    8 年前

    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;