2008-09-18 90 views
6

我正在第一次编写WCF服务。该服务及其所有客户(至少现在)都是用C#编写的。该服务必须对所传递的数据进行大量输入验证,因此我需要一些方法将无效数据返回给客户端。我一直在阅读很多有关错误和异常的内容,包括错误中的例外情况,以及许多相互冲突的文章,这些文章只是让我更加困惑。什么是处理这种情况的正确方法?WCF故障和异常

我应该完全避免异常并打包结果返回消息吗?我应该创建一个特殊的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))。那么这是否是“正确”的方法?

回答

3

如果您正在客户端进行验证,并且在传入方法(Web服务调用)后应该具有有效值,那么我会抛出异常。它可能是一个异常,表示参数的名称与参数无效。 (请参阅:ArgumentException)

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

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

我对任何WCF服务的假设是会有多个UI。现在可以是一个Web UI,但稍后我可以使用WinForms,WinCE或者甚至是本机iPhone/Android移动应用程序添加另一个,这与您对.NET客户端的期望不一致。

2

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

使用与WCF的entlib你可以得到很多的验证,错误报告,而无需编写大量代码

+0

对于任何感兴趣的人,这里是[链接](http://msdn.microsoft.com/en-us/library/ff953182(v = pandp.50).aspx)EntLib验证块入门指南。 – Crackerjack 2012-03-08 23:28:06

4

抛出异常从WCF服务是没有用的为什么不呢?因为它回来作为裸故障,你需要

a)将故障,包括例外

B)解析故障得到异常的文字,看看发生了什么。

所以是的,你需要一个故障,而不是一个例外。就你而言,我会创建一个自定义错误,其中包含未通过验证的字段列表,作为错误合同的一部分。

请注意,WCF用字典(它不是ISerializable)做有趣的事情;它有特殊的处理,所以检查回来的消息看起来不错,在电线上;如果没有,它会回到你的阵列。