【问题标题】:silverlight client doesnt understand faultexceptionsilverlight 客户端不理解故障异常
【发布时间】:2011-01-28 18:20:24
【问题描述】:

我有一个抛出异常的 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 客户端无法获取我抛出的错误异常?

感谢您的宝贵时间...

【问题讨论】:

    标签: silverlight wcf faultexception


    【解决方案1】:

    好吧,所以最后似乎使这项工作的方法是在抛出错误异常之前将一行代码添加到服务中!

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

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

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

    【讨论】:

    • 这是实际的解决方案。戴夫的回复帮助我理解了它,所以我记下了他的回复。
    • 您好,我一直在用头撞墙,直到我发现您的问题并且您的解决方案像魔术一样起作用!你能解释一下这条线在做什么吗? System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      来自Data Performance and Fault Strategies in Silverlight 3:(本文将向您展示如何将 WCF 错误返回给 Silverlight。)

      臭名昭著的 NotFound 错误: 当引发异常时,HTTP 地位 返回 500 的代码 银光。浏览器网络 堆栈阻止 Silverlight 读取带有状态码的响应 500,所以任何 SOAP 故障信息 包含在其中是不可用的 Silverlight 客户端应用程序。甚至 如果可以检索到消息, Silverlight 2 不能 将故障转换回 托管异常。这两个 问题已在 Silverlight 3.

      【讨论】:

      • 所以 Silverlight 的设计没有考虑服务错误处理? :O
      • 看起来状态代码必须从 500 更改为 Silverlight 可以读取的内容......在服务端也是如此。那么,如果它是一项我无法控制的服务呢?我认为这是一个蹩脚的解决方法。我会再读一遍,看看我是否遗漏了什么!
      • 我已经完全按照那篇文章中提到的处理未声明的错误的方式进行了操作;仍然收到相同的错误:'System.Net.WebException'。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多