WCF 错误和异常

Posted

技术标签:

【中文标题】WCF 错误和异常【英文标题】:WCF faults and exceptions 【发布时间】:2010-09-10 23:19:20 【问题描述】:

我是第一次编写 WCF 服务。该服务及其所有客户端(至少目前是这样)都是用 C# 编写的。该服务必须对其传递的数据进行大量输入验证,因此我需要有一些方法将无效数据指示回客户端。我已经阅读了很多关于故障和异常、将异常包装在故障中的文章,以及许多让我更加困惑的相互矛盾的文章。处理这种情况的正确方法是什么?

我应该完全避免异常并打包结果返回消息吗?我应该创建一个特殊的故障,还是一个特殊的异常,或者像我为非 WCF 验证函数一样抛出 ArgumentExceptions?

我现在的代码(受MSDN影响)是:

[DataContract]
public class ValidationFault

    [DataMember]
    public Dictionary<string, string> Errors  get; private set; 

    [DataMember]
    public bool Fatal  get; private set; 

    [DataMember]
    public Guid SeriesIdentifier  get; private set; 

    public ValidationFault(Guid id, string argument, string error, bool fatal)
    
        SeriesIdentifier = id;
        Errors = new Dictionary<string, string> argument, error;
        Fatal = fatal;
    

    public void AddError(string argument, string error, bool fatal)
    
        Errors.Add(argument, error);
        Fatal |= fatal;
    

在方法上有 [FaultContract(typeof(ValidationFault))]。那么这是解决这个问题的“正确”方法吗?

【问题讨论】:

【参考方案1】:

从 WCF 服务中抛出异常没有用 为什么不呢?因为它作为一个简单的错误回来,你需要

a) 设置故障以包含异常

b) 解析故障以获取异常的文本并查看发生了什么。

所以是的,您需要的是错误而不是异常。在您的情况下,我会创建一个自定义故障,其中包含作为故障合同的一部分未能通过验证的字段列表。

请注意,WCF 使用不是 ISerializable 的字典来做一些有趣的事情;它有特殊处理,所以检查返回的消息在网络上看起来不错;如果不是,它会为您返回数组。

【讨论】:

【参考方案2】:

如果您在客户端上进行验证,并且一旦将它们传递到方法(Web 服务调用)中应该具有有效值,那么我会抛出异常。这可能是一个异常,表明参数名称无效。 (参见:ArgumentException)

但是您可能不想依赖客户端来正确验证数据,这会让您假设进入 Web 服务的数据可能无效。在那种情况下,它并不是真正的例外情况,也不应该是例外。在这种情况下,您可以返回一个枚举或一个 Result 对象,该对象的 Status 属性设置为枚举(OK、Invalid、Incomplete)和一个 Message 属性集,其中包含参数名称等细节。

我会确保在开发过程中发现并修复这些类型的错误。您的 QA 流程应仔细测试客户端的有效和无效使用,并且您不希望将这些技术消息转发回客户端。您想要做的是更新您的验证系统,以防止无效数据进入服务调用。

我对任何 WCF 服务的假设是会有多个 UI。现在一个可能是 Web UI,但稍后我可能会使用 WinForms、WinCE 甚至是不符合您对 .NET 客户端期望的原生 iPhone/android 移动应用程序添加另一个。

【讨论】:

【参考方案3】:

您可能需要结合策略注入块link text 来查看 MS 模式和实践企业库验证块,它允许您使用验证属性装饰数据合约成员并装饰服务实现,这连同它与 WCF 的集成,这意味着验证失败会自动返回为 ArgumentValidationException 错误,每个错误都包含每个验证失败的 ValidationDetail 对象。

将 entlib 与 WCf 一起使用,您无需编写太多代码即可获得大量验证、错误报告

【讨论】:

对于任何感兴趣的人,这里是 link EntLib 验证块的入门指南。

以上是关于WCF 错误和异常的主要内容,如果未能解决你的问题,请参考以下文章

WCF 错误处理

在IIS上抛出异常的WCF托管(没有权限和HTTP错误404.3 - 未找到)

WCF 异步调用 - 事件处理程序中的异常

尝试在 ASP.NET 网站中托管时出现 WCF 服务异常错误

.NET WCF 异常

在WCF中,自定义Authentication,Validate方法,抛出错误异常时如何在不停止服务的情况下处理异常?