【发布时间】:2011-09-12 20:02:40
【问题描述】:
我在启用 Silverlight 的服务中抛出异常,并在我的 silverlight 客户端中捕获它。我按照手册做了所有事情,但仍然得到我认为是意外的行为。
来自客户端的代码
try
{
client.ThrowFaultExceptionCompleted += (s, args) =>
{
DoCallback(args);
};
client.ThrowFaultExceptionAsync(new ThrowFaultExceptionRequest());
}
catch (FaultException<MyFaultException> myFex)
{
}
catch (FaultException fex)
{
}
这是来自服务的代码
我的自定义故障异常类
[DataContract]
public class MyFaultException
{
private string _reason;
private string _myExceptionStackTrace;
[DataMember]
public string Reason
{
get { return _reason; }
set { _reason = value; }
}
[DataMember]
public string MyExceptionStackTrace
{
get { return _myExceptionStackTrace; }
set { _myExceptionStackTrace = value; }
}
}
引发故障异常的服务端代码。出于测试目的,我从客户端调用此方法。
[OperationContract]
[FaultContract(typeof(MyFaultException))]
public void ThrowFaultException()
{
MyFaultException mfex = new MyFaultException();
mfex.Reason = "No Reason!";
mfex.MyExceptionStackTrace = "Long stack trace here";
System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
//throw new FaultException<MyFaultException>(mfex ,new FaultReason(new FaultReasonText("My Fault Reason Text here!")), new FaultCode("my fault code here"));
throw new FaultException<MyFaultException>(mfex);
}
无论我是使用单个参数还是在注释行中使用这三个参数抛出 FaultException,我都会在 silverlight 代理类中的 Reference.cs 文件中收到错误,如下所示
它永远不会进入任何一个 catch 块。这是正常的行为吗?我现在必须在回调方法 DoCallback(args) 中捕获错误,并在该方法中检查 (args.Error == null)。为什么catch块没有被击中?
感谢您的宝贵时间...
【问题讨论】:
-
您为什么用 FaultReason 参数注释了该行?错误消息需要说明原因。
-
我认为它会阻止上图中的错误。原因封装在 MyFaultException 对象中。
-
@user20358 如果取消注释
throw new FaultException<MyFaultException>(mfex ,new FaultReason(...行,异常消息将有所不同。尝试这样做并使用有关更改的信息更新您的问题。 -
问题是我的reference.cs文件中也出现了这个错误。我只想在 silverlight 客户端中得到这个错误。如果我取消注释该行,我会得到“我的错误原因文本在这里!”代替“此故障的创建者未指定原因”。由于这是一个研究项目,我现在不关心信息。我只关心它出现在我的参考文件中。我不希望服务在部署后爆炸。
-
@user20358 好的,我已经测试了你的代码。在我的情况下,此消息出现在服务端和文件 Reference.cs 中。但是异常由自动生成的代码处理,并且可以从回调事件参数中访问。所以这是正常行为,只使用检查操作,您可以从客户端代码中删除 try-catch 块。
标签: silverlight wcf exception-handling