【问题标题】:RIA Services and FaultContractRIA 服务和故障合同
【发布时间】:2011-09-11 13:43:21
【问题描述】:

如何将 FaultContract 属性与 RIA 服务一起使用,以便能够将附加信息作为异常的一部分传递给 Silverlight?

【问题讨论】:

  • 我也有同样的问题...找到什么了吗?

标签: silverlight exception-handling wcf-ria-services


【解决方案1】:

所以我去寻找反编译的 RIA 服务代码。似乎不可能显着改变发送给客户端的错误信息。

您可以在 DomainService 中覆盖 OnError() 方法,但这不允许您将任意信息传回,即使它是自定义异常类型。

原因隐藏在DomainServices.Hosting.QueryProcessor类的异常处理中。

如果在域操作中发生未处理的异常,它会冒泡,然后最终抛出 FaultException()(WCF 本身会处理该异常)。

不幸的是,DomainServiceFault 类非常轻量级...它只有几个属性...

public class DomainServiceFault
{
    public int ErrorCode { get; set; }
    public string ErrorMessage { get; set; }
    public bool IsDomainException { get; set; }
    public string StackTrace { get; set; }
    public IEnumerable<ValidationResultInfo> OperationErrors { get; set; }

    public IEnumerable<ValidationResult> GetValidationErrors()
    {}
}

这些被填充在ServiceUtility.CreateFaultExceotion() 中,如下所示:

DomainServiceFault detail = new DomainServiceFault();
<snip/>
detail.ErrorCode = domainException.ErrorCode;
detail.ErrorMessage = ServiceUtility.FormatExceptionMessage((Exception) domainException);
detail.IsDomainException = true;

if (current != null && !current.IsCustomErrorEnabled)
    detail.StackTrace = domainException.StackTrace;

return new FaultException<DomainServiceFault>(detail, new FaultReason(new FaultReasonText(detail.ErrorMessage ?? string.Empty, CultureInfo.CurrentCulture)));

值得注意的是,在出现异常而不是验证错误的情况下,OperationErrors 不会被填充。

所以所有这一切的结果是,我认为不可能将自定义异常信息包装或附加到 DomainService 错误处理程序(这真的很不幸)。

【讨论】:

  • 所有这些小缺点让您觉得 RIA 服务框架还没有为现实世界的场景做好准备......无论如何,谢谢!
  • @sternr 我们经常有这种感觉。我认为 RIA 服务非常适合基本数据模型和应用程序。对于极其详细和复杂的应用程序,它开始挣扎。
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 2021-02-01
  • 2010-11-06
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
相关资源
最近更新 更多