我有一个WCF服务,它抛出一个异常,我试图在我的silverlight客户端代码中捕获不成功。我使用Undeclared Faults进行调试,这是我的服务方法:
[OperationContract]
public ServiceResponse MyWCFServiceMethod()
{
ServiceResponse resp = new ServiceResponse ();
//code for setting resp...
//purposely throw error here.
throw new FaultException(new FaultReason(new FaultReasonText("My fault Reason!")),new FaultCode("my fault code here"));
return resp;
}
现在在我的silverlight客户端视图模型中,在服务的回调方法中,我尝试像这样处理它:
private void MyServiceCallback(MyWCFServiceMethodCompletedEventArgs e)
{
if (e.Error == null)
{
//proceed normally
}
else if (e.Error is FaultException)
{
FaultException<ExceptionDetail> fault = e.Error as FaultException<ExceptionDetail>;
MessageBox.Show(fault.Detail.Message);
MessageBox.Show(fault.Reason.ToString());
}
}
在这一行else if (e.Error is FaultException)
我仍然得到System.Net.WebException {远程服务器返回错误:NotFound。}
这些是配置条目
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
这是服务类声明
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MySilverlightWCFService
{
....
此服务位于同一Silverlight解决方案中的另一个项目中。 为什么我的silverlight客户端无法解决我抛出的故障异常?
感谢您的时间......
答案 0 :(得分:7)
好的,所以最终看起来这样做的方法是在抛出错误异常之前将一行代码添加到服务中!
System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
然后抛出实际的异常:
throw new FaultException(new FaultReason(new FaultReasonText("My fault Reason!")),new FaultCode("my fault code here"));
然后在silverlight中修改服务回调错误处理部分,从我在上面的问题中添加到:
//else if (e.Error is FaultException)
else
{
//FaultException<ExceptionDetail> fault = e.Error as FaultException<ExceptionDetail>;
//MessageBox.Show(fault.Detail.Message);
FaultException fault = e.Error as FaultException;
MessageBox.Show(fault.Reason.ToString());
}
这对我有用。丑陋的方式!
当我抽出时间时,我会尝试使用已声明的错误。
答案 1 :(得分:3)
查看SilverlightFaultBehavior。它将处理为您更改状态代码。
答案 2 :(得分:2)
服务器可能正在抛出Silverlight忽略的HTTP 500响应代码。您必须更改服务以返回Silverlight将接受的HTTP代码。
来自Data Performance and Fault Strategies in Silverlight 3 :(本文将向您展示如何将WCF错误返回给Silverlight。)
臭名昭着的NotFound错误: 引发异常时,HTTP 状态 代码500返回 Silverlight的。浏览器网络 堆栈阻止Silverlight 使用状态代码阅读回复 500,所以任何SOAP故障信息 包含在内的内容不可用 Silverlight客户端应用程序。甚至 如果可以检索到该消息, Silverlight 2无法使用 将故障转换回来 管理异常。这两个 问题已经解决了 Silverlight 3。