• 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类型,否则无法正确接收错误提示。

  • 相关阅读:
    12个国外优秀.Net开源项目
    CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持]
    秋色园QBlog V2.5 后台管理系统源码发布下载
    秋色园QBlog技术原理解析:认识整站处理流程(二)
    CYQ.Data 数据框架 加快开源速度 发布V1.5.5版本源码
    秋色园[CYQ.Data]开源团队寻人
    秋色园QBlog技术原理解析:页面内容填充及多语言翻译流程演示示例(十)
    CYQ.Data 数据框架 性能评测
    框架设计:实现数据的按需更新与插入的改进
    秋色园QBlog技术原理解析:Module之基类生命周期页面加载(七)
  • 原文地址:https://www.cnblogs.com/shenba/p/2306739.html
Copyright © 2020-2023  润新知