上接方法一
实现的第二种方法是利用企业库提供的针对WCF程序的validation block,如果之前有用过企业库的validation模块,那么在WCF中用起来就非常简单,在WCF中要做的大部分都是配置工作。
步骤一,引用相关的dll
Microsoft.Practices.EnterpriseLibrary.Common.dll
Microsoft.Practices.EnterpriseLibrary.Validation.dll
Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll
步骤二,在指定的接口中设置一个ValidationBehavior属性标记,该标记的目的是表明方法参数中包含需要验证逻辑。当然ValitionBehavior也可以通过配置文件形式注入,具体可参考上一篇博客内容。
View Code
2 [ValidationBehavior]
3 public interface ITradeService
步骤三,在需要验证的参数上标记验证属性,以及给方法标记FaultContract。如果有多个参数,以此给指定参数加标记即可。对于FaultContract中必须指定,这样才能将验证信息返回。

2 string TradeSomething(
3 [StringLengthValidator(10, MessageTemplate = "ths length of qutoeName must less than {0}")]
4 string quoteName);
到此,服务单的配置就完成了。
接下来说一下客户端的如何获取错误信息。
类似其他服务,通过svcutil生成得到一个客户端类,然后如果按往常那样处理FaultException,将得不到正确的错误提示。如下代码得到的信息是“此错误的创建者没有指定原因”。

{
try
{
Console.WriteLine(client.TradeSomething("ztejlkfjdslakfjdlskag"));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
对于企业库返回的FaultException的错误信息,需要特殊处理,对catch部分的代码做如下修改即可

{
try
{
Console.WriteLine(client.TradeSomething("ztejlkfjdslakfjdlskag"));
}
catch (System.ServiceModel.FaultException<ValidationFault> ex)
{
foreach (var item in ex.Detail.Details)
{
Console.WriteLine(item.Message);
}
}
}
这里需要强调的是,ValidationFault的类型必须跟服务用的一致,要么使用svcutil中自动生成的类型,或者直接引用企业库的dll。当引用企业库的dll之后,就不能使用svcutil生成的ValidationFault类型,否则无法正确接收错误提示。