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 错误和异常的主要内容,如果未能解决你的问题,请参考以下文章
在IIS上抛出异常的WCF托管(没有权限和HTTP错误404.3 - 未找到)