如何确定从WCF返回的错误类型?

时间:2011-03-17 20:18:23

标签: c# silverlight wcf

嘿,我有一个连接到WCF服务的Silverlight应用程序,我使用这样的事件args捕获错误:

private void GetContainersCompleted(object sender, GetContainersCompletedEventArgs e)
{
    if (e.Error != null)
    {
        // show some generic message
    }
    else
    {
        // process
    }
}

如何确定它是什么类型的错误?服务中断,网络不可用等

由于

更新

我感兴趣的是连接和网络异常,这就是我最终做的事情:

private void GetContainersCompleted(object sender, GetContainersCompletedEventArgs e)
{
    if (e.Error != null)
    {
        if (e.Error.InnerException is EndpointNotFoundException ||
            e.Error.InnerException is CommunicationException ||
            e.Error.InnerException is SecurityException)
        {
            // show connection error message
        }
        else
        {
            // show generic error message
        }
    }
    else
    {
        // process
    }
}

有什么建议吗?

由于

4 个答案:

答案 0 :(得分:3)

您应该在开发环境中的服务器上启用.NET WCF跟踪。 WCF异常通常没有用。这是我发现追踪WCF问题的唯一方法。特别是消息太大,数据合同中的循环引用等等。我不确定你是否可以在客户端级别打开它,因为我不熟悉Silverlight。虽然如果它可以在svc中完成,它也可以在代码中完成。

http://msdn.microsoft.com/en-us/library/ms733025.aspx

答案 1 :(得分:0)

尝试将其放在try catch块中并检查异常的InnerException属性。

try
{
      // var something = e.Result
}
catch(Exception ex)
{
      if (ex.InnerException != null)
      {
           Log.Write(LogTypes.ERROR, "\nInner exception:\n" + ex.InnerException.StackTrace
                                       + "\nex = " + ex.InnerException.Message);
      }
}

答案 2 :(得分:0)

我不能100%确定这是否与你所要求的相关,但是......

在HTTP WCF服务中,当您在服务器上抛出异常时,响应的HTTP状态代码为500,表示错误。在使用WCF的标准.NET客户端中,这不会产生任何差别,但在浏览器中运行的Silverlight中,浏览器会部分处理错误(这是一个手工描述的波形;我不知道完全发生了什么)以及最终传递给Silverlight的是一般错误,其中没有任何信息。

解决这个问题的方法是在它离开服务器之前更改repsonse的状态代码。见here

答案 3 :(得分:0)

CP Link包含与您的查询相关的确切帖子

“对于WCF服务,我们有所谓的故障。简单地说,它不是在服务中抛出异常,而是抛出一个特殊的 FaulException,WCF Dispatcher处理并包装到我们的响应消息中。 ,当我们的客户收到时,将被解包并抛给调用客户端方法。

如果我们想要发送额外的信息以及我们的错误,我们只需创建一个可序列化的类(使用[Serializable]或[DataContract]属性),然后抛出泛型FaulException(其中T是我们的可序列化类) )并将我们的类发送到构造函数中。为了让客户端捕获这个唯一的异常,必须在可能引发此错误的操作协定之上声明[FaultContractAttribute(typeof(T))](其中T是我们的可序列化类)。 WCF创建的客户端代理将读取返回消息中的错误标头,并尝试将其转换为与我们在合同的FaultContractAttribute中定义的类型匹配的通用FaultException。“