RIA服务中的exception处理

如您所知,使用标准WCF服务的FaultException来建议处理exception以隐藏exception详细信息。 这没关系,但我遇到了WCF Ria服务的问题。 我想从域服务抛出exception,客户端将处理该exception。 我想避免泄露exception的敏感信息,如堆栈跟踪,方法名称等。如果它是标准的WCF服务,我会使用FaultExceptionexception,但在Ria服务中,它不起作用。 无论我从域服务抛出什么样的exception,客户端总是会得到DomainOperationException。 有没有办法可以从域服务向Silverlight客户端抛出FaultException(不透露实际的exception细节)? 例如,我有一个登录窗口。 当用户点击登录按钮时,应该有几个validation失败,例如:

  • 用户名或密码无效
  • 用户帐户已被锁定
  • 该帐户未激活
  • 等等

我希望每个可能发生的错误都有错误类型。 客户端应该检查出错的地方并相应地显示错误消息。 我禁用了customErrors但它没有帮助。 任何帮助,将不胜感激。 谢谢

这是科林布莱尔在这里回答我的问题

DomainService有一个名为OnError的可覆盖方法。 只要DomainService本身内存在exception(不在WCF代码中),exception就会在重新抛出之前传递给OnError,然后再发送回客户端。 如果使用您自己的exception替换传递给OnError方法的DomainServiceErrorInfo中的exception,那么您的exception将被发送回客户端。 如果对您的exception使用DomainException,那么您将能够传入一个ErrorCode整数,您可以使用客户端来确定实际错误。

它回答了我的问题和需求。 谢谢科林。

我已经读过在Silverlight中使用WCF故障,但尚未尝试使用WCF RIA。

http://mark.mymonster.nl/2011/02/10/make-use-of-wcf-faultcontracts-in-silverlight-clients/

代码示例:

[EnableClientAccess()] public class YourDomainService : DomainService { protected override void OnError(DomainServiceErrorInfo errorInfo) { base.OnError(errorInfo); customErrorHandler(errorInfo.Error); } private void customErrorHandler(Exception ex) { DomainServiceContext sc = this.ServiceContext; //Write here your custom logic handling exceptions } }