WCF完成事件中的异常处理

时间:2016-02-08 04:26:32

标签: c# wcf silverlight exception-handling

我想知道如何在@media only screen and (max-width: 767px) { .firstCol { padding-right: 0; } .secondCol { list-style-type: none; margin: auto; padding-left: 0; } } 已完成的事件方法中捕获异常并将其显示给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

2 个答案:

答案 0 :(得分:1)

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

  

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

如果要在客户端捕获特定异常,则应从服务中抛出所谓的FaultException。这些是 Soap Faults ,可以被任何消费者识别。请注意,您的服务的消费者并不总是.NET使用者,因此无法识别抛出CLR异常。这就是您需要throw Soap exception的原因。

E.g。这就是你如何抓住并抛出Fault Exception

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

有关wcf Faults

的更多详情,请阅读this article

答案 1 :(得分:0)

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;