RIA服务和FaultContract

4

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


我有同样的问题...你找到答案了吗? - sebagomez
1个回答

2

因此,我查看了反编译的RIA Services代码。似乎不可能显著地更改发送到客户端的错误信息。

您可以在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
@sternr 我们经常有这种感觉。我认为RIA服务非常适合基本的数据模型和应用程序。对于非常详细和复杂的应用程序,它开始遇到困难。 - Alastair Pitts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接