WCF中校验参数的实现方式(二)

上接方法一

实现的第二种方法是利用企业库提供的针对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

1     [ServiceContract]
2     [ValidationBehavior]
3     public interface ITradeService

步骤三,在需要验证的参数上标记验证属性,以及给方法标记FaultContract。如果有多个参数,以此给指定参数加标记即可。对于FaultContract中必须指定,这样才能将验证信息返回。

View Code
1 [FaultContract(typeof(ValidationFault))]
2         string TradeSomething(
3             [StringLengthValidator(10, MessageTemplate = "ths length of qutoeName must less than {0}")]
4             string quoteName);

 到此,服务单的配置就完成了。

接下来说一下客户端的如何获取错误信息。

类似其他服务,通过svcutil生成得到一个客户端类,然后如果按往常那样处理FaultException,将得不到正确的错误提示。如下代码得到的信息是“此错误的创建者没有指定原因”。

View Code
 using (var client = new TradeServiceClient())
            {
                try
                {
                    Console.WriteLine(client.TradeSomething("ztejlkfjdslakfjdlskag"));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

对于企业库返回的FaultException的错误信息,需要特殊处理,对catch部分的代码做如下修改即可

View Code
using (var client = new TradeServiceClient())
            {
                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类型,否则无法正确接收错误提示。

 

 

 

posted @ 2011-12-29 22:30  神八  阅读(1170)  评论(0编辑  收藏  举报