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

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

我现在拥有的代码(受 微软软件定义网络) 是:

[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 服务调用)中就应该具有有效值,那么我会抛出异常。这可能是一个异常,表明参数对于参数名称无效。(看:参数异常)

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

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

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

其他提示

从 WCF 服务中抛出异常没有用,为什么不呢?因为它只是一个纯粹的错误,你需要

a) 设置故障以包含异常

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

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

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

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

将 entlib 与 WCF 结合使用,您可以获得大量验证和错误报告,而无需编写太多代码

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top