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

本文介绍了一个使用正则表达式验证参数的自定义行为。该行为可以应用于任何操作,并允许开发人员定义正则表达式及错误消息。文章展示了如何实现这一行为,并将其作为属性添加到服务描述中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

列表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;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值