• WCF 第五章 行为 以属性为服务操作行为暴露一个参数检测器


    列表5.24实现一个使用正则表达式验证参数的行为。它可以应用到任何操作上并允许开发人员定义一个正则表达式和当参数不合法时用来返回错误信息的消息。

      代码显示了从一个操作行为调用的一个参数检测器并显示了实现一个属性的操作行为。它也显示了如何通过在服务定义中引用属性来讲操作行为添加到服务描述中。

      类myParameterInspector实现了IParemeterInspector接口。类存储了两个本地属性,_pattern和_message,用来在BeforeCall方法中验证参数。在那个方法中,使用正则表达式来匹配参数值和参数pattern.如果值与pattern不符合,会抛出一个错误。

      类myOperationBehavior是吸纳了IEndpointBehavior和Attribute接口。在AddDispatchBehavior方法中它添加myParameterInspector类到将要被每个操作调用的参数检测器列表中去。最后,当服务操作时,GetPrice,被定义,myOperationBehavior属性用来在运行时验证它的参数。

    列表5.24 在一个操作行为中以属性暴露的自定义参数检测器

        [AttributeUsage(AttributeTargets.Method)]
        public class myOperationBehavior : Attribute, IOperationBehavior
        {
            public string pattern;
            public string message;
    
            public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
            {
            }
            public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
            {
            }
            public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
            {
                dispatchOperation.ParameterInspectors.Add(new myParameterInspector(this.pattern, this.message));
            }
            public void Validate(OperationDescription operationDescription)
            {
            }
        }
        class myParameterInspector : IParameterInspector
        {
            string _pattern;
            string _message;
            public myParameterInspector(string pattern, string message)
            {
                _pattern = pattern;
                _message = message;
            }
            public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
            {
            }
    
            public object BeforeCall(string operationName, object[] inputs)
            {
                foreach (object input in inputs)
                {
                    if ((input != null) && (input.GetType() == typeof(string)))
                    {
                        Regex regex = new Regex(_pattern);
                        if (regex.IsMatch((string)input))
                        {
                            throw new FaultException(string.Format("Parameter out of range:{0}, {1}", (string)input, _message));
                        }
                    }
                }
                return null;
            }
        }
    
    [ServiceContract]
        public interface IStockService
        {
            [OperationContract]
            double GetPrice(string ticker);
        }
    
        public class StockService : IStockService
        {
            [myOperationBehavior(pattern = "[^a-zA-Z]", message = "Only alpha characters allowed")]
            public double GetPrice(string ticker)
            {
                if (ticker == "MSFT")
                {
                    return 94.85;
                }
                else
                {
                    return 0.0;
                }
            }
        }
    


    作者:DanielWise
    出处:http://www.cnblogs.com/danielWise/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    《测试工作量的时间评估》方案梳理
    GitHub 生成密钥
    Jenkins+Jmeter持续集成(五、Ant+GitLab持续构建)
    Linux下查看文件和文件夹大小
    Java Runtime.exec()的使用
    如何启动/停止/重启MySQL
    浅析Java语言慢的原因
    chattr命令锁定账户敏感文件
    SOAP协议初级指南 (三)
    SOAP协议初级指南 (二)
  • 原文地址:https://www.cnblogs.com/danielWise/p/1904733.html
Copyright © 2020-2023  润新知