【发布时间】:2011-09-11 13:43:21
【问题描述】:
如何将 FaultContract 属性与 RIA 服务一起使用,以便能够将附加信息作为异常的一部分传递给 Silverlight?
【问题讨论】:
-
我也有同样的问题...找到什么了吗?
标签: silverlight exception-handling wcf-ria-services
如何将 FaultContract 属性与 RIA 服务一起使用,以便能够将附加信息作为异常的一部分传递给 Silverlight?
【问题讨论】:
标签: silverlight exception-handling wcf-ria-services
所以我去寻找反编译的 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 错误处理程序(这真的很不幸)。
【讨论】: