WCF错误和异常

时间:2020-03-06 14:23:40  来源:igfitidea点击:

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

我应该完全避免异常并打包结果返回消息吗?我应该创建一个特殊的Fault或者一个特殊的Exception,还是像非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)))。那么这是解决这个问题的"正确"方法吗?

解决方案

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

但是我们可能不希望依赖客户端来正确验证数据,这使我们假设数据可能无效,从而无法进入Web服务。在那种情况下,这并不是真正的例外情况,也不应该例外。在这种情况下,我们可以返回一个枚举或者一个Result对象,该对象的Status属性设置为枚举(确定,无效,不完整),并且Message属性设置为特定的参数名称,例如参数名称。

我将确保在开发过程中发现并修复此类错误。质量检查流程应仔细测试客户端的有效使用和无效使用,并且我们不希望将这些技术消息传递回客户端。我们要做的是更新验证系统,以防止无效数据进入服务呼叫。

我对任何WCF服务的假设都是会有多个UI。现在可能是一个Web UI,但是以后我可能会使用WinForms,WinCE甚至是本机iPhone / Android移动应用程序添加另一个,它与.NET客户端的要求不符。

我们可能需要结合策略注入块链接文本来查看" MS模式和实践企业库验证"块,它允许我们使用验证属性来装饰数据合同成员,还可以装饰服务实现,以及它的集成。使用WCF,这意味着验证失败将作为ArgumentValidationException错误自动返回,每个错误都包含每个验证失败的ValidationDetail对象。

将entlib与WCf结合使用,我们可以进行大量的验证,错误报告,而无需编写大量代码

从WCF服务中引发异常是没有用的,为什么不呢?因为它作为一个纯粹的错误回来,所以我们需要

a)设置故障以包括异常

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

因此,是的,我们需要一个错误而不是一个例外。在情况下,我将创建一个自定义故障,其中包含作为故障合同一部分而未能通过验证的字段的列表。

请注意,WCF使用字典来使事情变得有趣,这些字典不能进行ISerializable;它具有特殊的处理方式,因此请检查回传的消息在线路上看起来是否良好;如果没有,它会为我们返回数组。