zoukankan      html  css  js  c++  java
  • IClientMessageInspector IDispatchMessageInspector

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using System.ServiceModel;
    using System.ServiceModel.Dispatcher;
    using System.ServiceModel.Description;
    using System.ServiceModel.Channels;
    
    namespace MyLib
    {
        /// <summary>
        ///  消息拦截器
        /// </summary>
        public class MyMessageInspector:IClientMessageInspector,IDispatchMessageInspector
        {
            void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState)
            {
                Console.WriteLine("客户端接收到的回复:
    {0}", reply.ToString());
            }
    
            object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel)
            {
                Console.WriteLine("客户端发送请求前的SOAP消息:
    {0}", request.ToString());
                return null;
            }
    
            object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
            {
                Console.WriteLine("服务器端:接收到的请求:
    {0}", request.ToString());
                return null;
            }
    
            void IDispatchMessageInspector.BeforeSendReply(ref Message reply, object correlationState)
            {
                Console.WriteLine("服务器即将作出以下回复:
    {0}", reply.ToString());
            }
        }
    
        /// <summary>
        /// 插入到终结点的Behavior
        /// </summary>
        public class MyEndPointBehavior : IEndpointBehavior
        {
            public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
            {
                // 不需要
                return;
            }
    
            public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
            {
                // 植入“偷听器”客户端
                clientRuntime.ClientMessageInspectors.Add(new MyMessageInspector());
            }
    
            public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
            {
                // 植入“偷听器” 服务器端
                endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector());
            }
    
            public void Validate(ServiceEndpoint endpoint)
            {
                // 不需要
                return;
            }
        }
    
    }
    

      

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using System.Runtime;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    namespace WCFServer
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 服务器基址
                Uri baseAddress = new Uri("http://localhost:1378/services");
                // 声明服务器主机
                using (ServiceHost host = new ServiceHost(typeof(MyService), baseAddress))
                {
                    // 添加绑定和终结点
                    WSHttpBinding binding = new WSHttpBinding();
                    host.AddServiceEndpoint(typeof(IService), binding, "/test");
                    // 添加服务描述
                    host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
                    // 把自定义的IEndPointBehavior插入到终结点中
                    foreach (var endpont in host.Description.Endpoints)
                    {
                        endpont.EndpointBehaviors.Add(new MyLib.MyEndPointBehavior());
                    }
                    try
                    {
                        // 打开服务
                        host.Open();
                        Console.WriteLine("服务已启动。");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    Console.ReadKey();
                }
            }
        }
    
        [ServiceContract(Namespace = "MyNamespace")]
        public interface IService
        {
            [OperationContract]
            int AddInt(int a, int b);
            [OperationContract]
            Student GetStudent();
            [OperationContract]
            CalResultResponse ComputingNumbers(CalcultRequest inMsg);
        }
    
        [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
        public class MyService : IService
        {
            public int AddInt(int a, int b)
            {
                return a + b;
            }
    
            public Student GetStudent()
            {
                Student stu = new Student();
                stu.StudentName = "小明";
                stu.StudentAge = 22;
                return stu;
            }
    
            public CalResultResponse ComputingNumbers(CalcultRequest inMsg)
            {
                CalResultResponse rmsg = new CalResultResponse();
                switch (inMsg.Operation)
                {
                    case "加":
                        rmsg.ComputedResult = inMsg.NumberA + inMsg.NumberB;
                        break;
                    case "减":
                        rmsg.ComputedResult = inMsg.NumberA - inMsg.NumberB;
                        break;
                    case "乘":
                        rmsg.ComputedResult = inMsg.NumberA * inMsg.NumberB;
                        break;
                    case "除":
                        rmsg.ComputedResult = inMsg.NumberA / inMsg.NumberB;
                        break;
                    default:
                        throw new ArgumentException("运算操作只允许加、减、乘、除。");
                        break;
                }
                return rmsg;
            }
        }
    
        [DataContract]
        public class Student
        {
            [DataMember]
            public string StudentName;
            [DataMember]
            public int StudentAge;
        }
    
        [MessageContract]
        public class CalcultRequest
        {
            [MessageHeader]
            public string Operation;
            [MessageBodyMember]
            public int NumberA;
            [MessageBodyMember]
            public int NumberB;
        }
    
        [MessageContract]
        public class CalResultResponse
        {
            [MessageBodyMember]
            public int ComputedResult;
        }
    }
    

      

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WCFClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                WS.ServiceClient client = new WS.ServiceClient();
                // 记得在客户端也要插入IEndPointBehavior
                client.Endpoint.EndpointBehaviors.Add(new MyLib.MyEndPointBehavior());
                try
                {
                    // 1、调用带元数据参数和返回值的操作
                    Console.WriteLine("
    20和35相加的结果是:{0}", client.AddInt(20, 35));
                    // 2、调用带有数据协定的操作
                    WS.Student student = client.GetStudent();
                    Console.WriteLine("
    学生信息---------------------------");
                    Console.WriteLine("姓名:{0}
    年龄:{1}", student.StudentName, student.StudentAge);
                    // 3、调用带消息协定的操作
                    Console.WriteLine("
    15乘以70的结果是:{0}", client.ComputingNumbers("乘", 15, 70));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("异常:{0}", ex.Message);
                }
    
                client.Close();
                Console.ReadKey();
            }
        }
    }
    

      

        /// <summary>
        ///  消息拦截器
        /// </summary>
        public class MyMessageInspector:IClientMessageInspector,IDispatchMessageInspector
        {
            void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState)
            {
                //Console.WriteLine("客户端接收到的回复:
    {0}", reply.ToString());
                return;
            }
    
            object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel)
            {
                //Console.WriteLine("客户端发送请求前的SOAP消息:
    {0}", request.ToString());
                // 插入验证信息
                MessageHeader hdUserName = MessageHeader.CreateHeader("u", "fuck", "admin");
                MessageHeader hdPassWord = MessageHeader.CreateHeader("p", "fuck", "123");
                request.Headers.Add(hdUserName);
                request.Headers.Add(hdPassWord);
                return null;
            }
    
            object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
            {
                //Console.WriteLine("服务器端:接收到的请求:
    {0}", request.ToString());
                // 栓查验证信息
                string un = request.Headers.GetHeader<string>("u", "fuck");
                string ps = request.Headers.GetHeader<string>("p", "fuck");
                if (un == "admin" && ps == "abcd")
                {
                    Console.WriteLine("用户名和密码正确。");
                }
                else
                {
                    throw new Exception("验证失败,滚吧!");
                }
                return null;
            }
    
            void IDispatchMessageInspector.BeforeSendReply(ref Message reply, object correlationState)
            {
                //Console.WriteLine("服务器即将作出以下回复:
    {0}", reply.ToString());
                return;
            }
        }
  • 相关阅读:
    我的知识库(4) java获取页面编码(Z)
    知识库(3)JAVA 正则表达式 (超详细)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts
    某人总结的《英语听力的技巧 》,挺搞的
    我的知识库(5)java单例模式详解
    构建可扩展程序
    SerialPort (RS232 Serial COM Port) in C# .NET
    Python学习笔记——String、Sequences
    UI题目我的答案
    jQuery学习系列学会操纵Form表单元素(1)
  • 原文地址:https://www.cnblogs.com/xiangxiong/p/6769219.html
Copyright © 2011-2022 走看看