3

我有一个抛出异常的 WCF 服务,我试图在我的 silverlight 客户端代码中捕获失败。我正在使用未声明的故障进行调试,这是我的服务方法:

[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 客户端无法获得我抛出的错误异常?

谢谢你的时间...

4

3 回答 3

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());
   }

这对我有用。丑陋的方式!

当我有时间时,我会尝试使用已声明的错误。

于 2011-01-30T11:44:46.833 回答
3

查看SilverlightFaultBehavior。它将为您处理更改状态代码。

于 2012-03-01T14:15:33.657 回答
2

服务器可能会抛出 Silverlight 忽略的 HTTP 500 响应代码。您必须更改服务以返回 Silverlight 将接受的 HTTP 代码。

来自Silverlight 3 中的数据性能和故障策略:(本文将向您展示如何将 WCF 故障返回给 Silverlight。)

臭名昭著的 NotFound 错误: 引发异常时,向 Silverlight 返回 HTTP 状态代码 500。浏览器网络堆栈阻止 Silverlight 读取状态代码为 500 的响应,因此 Silverlight 客户端应用程序无法使用其中包含的任何 SOAP 错误信息。即使可以检索到消息,Silverlight 2 也无法将故障转换回托管异常。Silverlight 3 中解决了这两个问题。

于 2011-01-28T18:30:46.933 回答