嘿,我有一个连接到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
}
}
有什么建议吗?
由于
答案 0 :(得分:3)
您应该在开发环境中的服务器上启用.NET WCF跟踪。 WCF异常通常没有用。这是我发现追踪WCF问题的唯一方法。特别是消息太大,数据合同中的循环引用等等。我不确定你是否可以在客户端级别打开它,因为我不熟悉Silverlight。虽然如果它可以在svc中完成,它也可以在代码中完成。
答案 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。“