博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Extending WCF using IServiceBehavior, IOperationBehavior, and IParameterInspector
阅读量:4650 次
发布时间:2019-06-09

本文共 10686 字,大约阅读时间需要 35 分钟。

[ServiceContract(Name = "PasswordGenerator")]public interface IPasswordGenerator{    [OperationContract(Name = "GeneratePassword")]    string GeneratePassword();    [OperationContract(Name="ParameterizedPasswordGenerator")]    string GeneratePassword(int length);}public class PasswordGenerator:IPasswordGenerator{    [OperationBehavior()]    public string GeneratePassword()    {        return "You called GeneratePassword()";    }    [OperationBehavior()]    public string GeneratePassword(int length)    {        return "You called GeneratePassword(int length) overload";    }}

  

static void Main(string[] args){    ServiceEndpoint serviceEndpoint;    Uri basePipeAddress = new Uri(@"net.Pipe://localhost/Password/Mine");    using (ServiceHost host =              new ServiceHost(typeof(Password.PasswordGenerator), basePipeAddress))    {        serviceEndpoint = host.AddServiceEndpoint(typeof(            Password.IPasswordGenerator), new NetNamedPipeBinding(), string.Empty);        host.Open();        using (var factory = new            ChannelFactory
(new NetNamedPipeBinding())) { var proxy = factory.CreateChannel(serviceEndpoint.Address); proxy.GeneratePassword(); proxy.GeneratePassword(1500); factory.Close(); } host.Close(); }}

  

public static class Logger{    private static void Log(string message)    {        try        {            using (var stream = new StreamWriter(@"G:\log.log", true))            {                stream.WriteLine(message);                stream.Flush();                stream.Close();            }        }        catch (Exception)        {                                }    }    public static void Log(string className, string methodName, string parameter)    {        Log(string.Format("Class {0} called method {1} with parameter {2} @ {3}",                className, methodName, parameter, DateTime.Now));    }    }

  First Extension

public class MyServiceBehaviorAttribute : Attribute, IServiceBehavior{     public void AddBindingParameters(ServiceDescription serviceDescription,       ServiceHostBase serviceHostBase,       Collection
endpoints, BindingParameterCollection bindingParameters) { Logger.Log("MyServiceBehaviorAttribute", "AddBindingParameters", serviceDescription.Name); } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { Logger.Log("MyServiceBehaviorAttribute", "ApplyDispatchBehavior", serviceDescription.Name); } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { Logger.Log("MyServiceBehaviorAttribute", "Validate", serviceDescription.Name); }}

  Second Extension

public class MyOperationBehavior:Attribute, IOperationBehavior {    public void AddBindingParameters(OperationDescription operationDescription,       System.ServiceModel.Channels.BindingParameterCollection bindingParameters)    {        Logger.Log("MyOperationBehavior",           "AddBindingParameters", operationDescription.Name);    }    public void ApplyClientBehavior(OperationDescription operationDescription,       System.ServiceModel.Dispatcher.ClientOperation clientOperation)    {        clientOperation.ParameterInspectors.Add(new MyParameterInspector());        Logger.Log("MyOperationBehavior",           "ApplyClientBehavior", operationDescription.Name);    }    public void ApplyDispatchBehavior(OperationDescription operationDescription,       System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)    {        dispatchOperation.ParameterInspectors.Add(new MyParameterInspector());        Logger.Log("MyOperationBehavior",           "ApplyDispatchBehavior", operationDescription.Name);    }    public void Validate(OperationDescription operationDescription)    {        Logger.Log("MyOperationBehavior", "Validate", operationDescription.Name);    }}

  Third Extension

class MyParameterInspector:IParameterInspector {    public void AfterCall(string operationName, object[] outputs,                           object returnValue, object correlationState)    {        Logger.Log("MyParameterInspector", "AfterCall", operationName);    }    public object BeforeCall(string operationName, object[] inputs)    {        Logger.Log("MyParameterInspector", "BeforeCall", operationName);        return null;    }}

  

[__strong__][MyServiceBehaviorAttribute()]public class PasswordGenerator:IPasswordGenerator{    [OperationBehavior(),MyOperationBehavior]    public string GeneratePassword()    {        return "You called GeneratePassword()";    }    [OperationBehavior()]    [MyOperationBehavior]    public string GeneratePassword(int length)    {        return "You called GeneratePassword(int length) overload";    }

  

 

 

---------------------------------------------------------------------------------------------------------------------

 

using System;using System.Collections.Generic;using System.Text;using System.ServiceModel;using System.ServiceModel.Description;using System.ServiceModel.Dispatcher;using System.Reflection;namespace AOPAndWCF{    class MyParameterInspector: IOperationBehavior, IParameterInspector    {        #region IOperationBehavior Members        ///         ///         ///         ///         ///         public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)        {                    }        ///         ///         ///         ///         ///         public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)        {                   }        ///         ///         ///         ///         ///         public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)        {            dispatchOperation.ParameterInspectors.Add(this);        }        ///         ///         ///         ///         public void Validate(OperationDescription operationDescription)        {                   }        #endregion                ///         /// 调用方法后 输出结果值        ///         ///         ///         ///         ///         public void AfterCall(string operationName, object[] outputs, object  returnValue, object correlationState)        {            Console.WriteLine("*************返回操作名称:" + operationName+"*************");            Console.WriteLine("*************返回操作编号:" + correlationState.ToString() + "**************");            for (int i = 0; i < outputs.Length; i++)            {                Type T = outputs[i].GetType();                Console.WriteLine("返回操作参数" + i.ToString() + "  类型为:" + T.ToString());                Console.WriteLine("返回操作参数" + i.ToString() + "  ToString为:" + outputs[i].ToString());                Console.WriteLine("返回操作参数" + i.ToString() + "  属性:");                PropertyInfo[] PIs = T.GetProperties();                foreach (PropertyInfo PI in PIs)                {                    Console.Write(PI.Name + ":");                    Console.WriteLine(PI.GetValue(outputs[i], null));                }            }            Type Treturn = returnValue.GetType();            Console.WriteLine("操作返回值" + "  类型为:" + Treturn.ToString());            Console.WriteLine("操作返回值" + "  ToString为:" + Treturn.ToString());            Console.WriteLine("操作返回值"  + "  属性:");            if (Treturn.ToString() != "System.String")            {                PropertyInfo[] PIreturns = Treturn.GetProperties();                foreach (PropertyInfo PI in PIreturns)                {                    Console.Write(PI.Name + ":");                    Console.WriteLine(PI.GetValue(returnValue, null));                }            }                  }        ///         /// 调用方法前 输出参数值        ///         ///         ///         /// 
public object BeforeCall(string operationName, object[] inputs) { Guid guid = Guid.NewGuid(); Console.WriteLine("*************调用操作名称:" + operationName+"**************"); Console.WriteLine("*************调用操作编号:" + guid.ToString () + "**************"); for (int i = 0; i < inputs.Length ; i++) { Type T = inputs[i] .GetType (); Console.WriteLine("操作参数"+i.ToString ()+" 类型为:"+T.ToString ()); Console.WriteLine("操作参数" + i.ToString() + " ToString为:" + inputs[i].ToString()); Console.WriteLine("操作参数" + i.ToString() + " 属性:"); PropertyInfo [] PIs = T.GetProperties(); foreach (PropertyInfo PI in PIs) { Console.Write ( PI.Name +":"); Console.WriteLine (PI.GetValue(inputs[i], null)); } } return guid; } }}

  

using System;using System.Collections.Generic;using System.Text;using System.ServiceModel ;using System.ServiceModel.Description;namespace AOPAndWCF{   public  class MyServiceHost:ServiceHost     {         ///        /// 构造函数       ///        /// 服务类型       /// 基地址        public MyServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) { }       ///        /// 应用配置文件设置       ///        protected override void ApplyConfiguration()       {           base.ApplyConfiguration();           //加入参数检查服务           addguidvalidation();       }           ///        ///加入参数检查服务       ///        private void addguidvalidation()       {           //加入参数检查服务           int endpointscount = this.Description.Endpoints.Count;           MyParameterInspector mypi = new MyParameterInspector();           for (int i = 0; i < endpointscount; i++)           {               if (this.Description.Endpoints[i].Contract.Name != "IMetadataExchange")               {                   int Operationscount = this.Description.Endpoints[i].Contract.Operations.Count;                   for (int j = 0; j < Operationscount; j++)                   {                       this.Description.Endpoints[i].Contract.Operations[j].Behaviors.Add(mypi);                   }               }           }       }    }}

  

using System;using System.Collections.Generic;using System.Text;namespace AOPAndWCF{    class Program    {        static void Main(string[] args)        {            MyServiceHost msh = new MyServiceHost(typeof(WcfServiceLibrary.Service1 ));            msh.Open();            Console.WriteLine ("服务已开启,回车关闭服务");            Console.ReadLine();            msh.Close();        }    }}

  

 

转载于:https://www.cnblogs.com/xiangxiong/p/6769431.html

你可能感兴趣的文章
函数名作为参数传递
查看>>
apt-get for ubuntu 工具简介
查看>>
数值计算算法-多项式插值算法的实现与分析
查看>>
day8-异常处理与网络编程
查看>>
Python基础-time and datetime
查看>>
Linux epoll 笔记(高并发事件处理机制)
查看>>
shell脚本练习01
查看>>
WPF图标拾取器
查看>>
通过取父级for循环的i来理解闭包,iife,匿名函数
查看>>
HDU 3374 String Problem
查看>>
数据集
查看>>
[Leetcode] unique paths ii 独特路径
查看>>
HDU 1217 Arbitrage (Floyd + SPFA判环)
查看>>
IntelliJ idea学习资源
查看>>
Django Rest Framework -解析器
查看>>
ExtJs 分组表格控件----监听
查看>>
Hibernate二级缓存配置
查看>>
LoadRunner常用术语
查看>>
关于jedis2.4以上版本的连接池配置,及工具类
查看>>
记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
查看>>