zoukankan      html  css  js  c++  java
  • 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类型,否则无法正确接收错误提示。

  • 相关阅读:
    集合容器
    洛谷P3953 逛公园
    洛谷P1967 货车运输
    洛谷P1073 最优贸易
    洛谷P4568 [JLOI2011]飞行路线
    洛谷P1265 公路修建
    洛谷P1503 鬼子进村
    洛谷P1613 跑路
    洛谷P4933 大师
    洛谷P4017 最大食物链计数
  • 原文地址:https://www.cnblogs.com/shenba/p/2306739.html
Copyright © 2011-2022 走看看