zoukankan      html  css  js  c++  java
  • 扩展WCF操作行为

    使用IParameterInspector, IOperationBehavior,Attribute(参数检查器、操作行为接口和标签)扩展WCF操作行为

    开发环境: VS2008 SP1 WIN2008 SP2
    WCF允许我们在端点Endpoint、消息message、操作Operation、参数Parameter中扩展WCF。本文简单介绍如何截获操作的参数来扩展WCF的操作。这种扩展需要在WCF的Contract契约上加标签来实现,不能算是真正的AOP,但是有些AOP的意思。
    实现步骤:1、实现自己的参数检查器;2、将参数检查器放入要实现的操作行为;3、在操作Operation上加入标签attribute

    1、实现自己的参数检查器,实现参数检查器,在调用操作前检查参数是否为17位数字,在调用操作后发送执行结果

    代码
        public class EntryIdInspector : IParameterInspector
        {
            
    public int
     intParamIndex
            {
                
    get
    ;
                
    set
    ;
            }
            
    string EntryIdFormat = @"\d{17}"
    ;
            
            
    public EntryIdInspector(): this(0
    ){ }
            
            
    public EntryIdInspector(int
     intParamIndex)
            {
                
    this.intParamIndex =
     intParamIndex;
            }

            
    public object BeforeCall(string operationName, object
    [] inputs)
            {
                
    string strEntryId = inputs[this.intParamIndex] as string
    ;
                
    if (!Regex.IsMatch(strEntryId, this
    .EntryIdFormat, RegexOptions.None))
                {
                    
                    MessageQueue mq 
    = new MessageQueue(@".\private$\msgqueue"
    );
                    mq.Send( 
    "Parameter is not valid when call " + operationName + " at " +
     DateTime.Now.ToLongDateString());
                    
    throw new
     FaultException(
                        
    "Invalid Entry ID format. Required format: ##################"
    );
                }
                
    return null
    ;

            }
            
    public void AfterCall(string operationName, object[] outputs, object returnValue, object
     correlationState)
            {
                MessageQueue mq 
    = new MessageQueue(@".\private$\msgqueue"
    );
                
    string strResult =
     returnValue.ToString();
                mq.Send(
    "Client call " + operationName + ":" + strResult + " at " +
     DateTime.Now.ToLongDateString());
                    
            }
        }

    2、将参数检查器放入要实现的操作行为

    代码
        public class EntryIdValidation : Attribute, IOperationBehavior
        {
            
    #region IOperationBehavior Members


            
    public void AddBindingParameters(OperationDescription operationDescription,
                BindingParameterCollection bindingParameters)
            {
            }

            
    public void
     ApplyClientBehavior(OperationDescription operationDescription,
                ClientOperation clientOperation)
            {
                EntryIdInspector EntryIdInspector 
    = new
     EntryIdInspector();
                clientOperation.ParameterInspectors.Add(EntryIdInspector);
            }

            
    public void
     ApplyDispatchBehavior(OperationDescription operationDescription,
                DispatchOperation dispatchOperation)
            {
                EntryIdInspector EntryIdInspector 
    = new
     EntryIdInspector();
                dispatchOperation.ParameterInspectors.Add(EntryIdInspector);
            }

            
    public void
     Validate(OperationDescription operationDescription)
            {
            }

            
    #endregion

        }

    3、在操作Operation上加入标签attribute,在操作契约中加上标签[EntryIdValidation]

        [ServiceContract]
        
    public interface
     IRelSrvContract
        {
            [EntryIdValidation]
            [OperationContract]
            bool
     Rel(string strEntryID);
        }
  • 相关阅读:
    git 命令速查及使用
    Centos6.5 LAMP环境源码包安装与配置,附安装包百度网盘地址 (转做笔记)
    不再为Apache进程淤积、耗尽内存而困扰((转))
    centos6.5 安装linux 环境
    window 配置wnmp(转下整理 ,全)
    mac下安装 xampp 无法启动apache (转,留用)
    Git命令行(转用于学习和记录)
    apache 局域网访问
    华为云GaussDB(for opengauss)如何绑定公网,实现putty的远程访问gaussdb数据库。
    Day9 打卡acwing.429 奖学金
  • 原文地址:https://www.cnblogs.com/utopia/p/1644787.html
Copyright © 2011-2022 走看看