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("客户端接收到的回复:\n{0}", reply.ToString());
- }
- object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel)
- {
- Console.WriteLine("客户端发送请求前的SOAP消息:\n{0}", request.ToString());
- return null;
- }
- object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
- {
- Console.WriteLine("服务器端:接收到的请求:\n{0}", request.ToString());
- return null;
- }
- void IDispatchMessageInspector.BeforeSendReply(ref Message reply, object correlationState)
- {
- Console.WriteLine("服务器即将作出以下回复:\n{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("\n20和35相加的结果是:{0}", client.AddInt(20, 35));
- // 2、调用带有数据协定的操作
- WS.Student student = client.GetStudent();
- Console.WriteLine("\n学生信息---------------------------");
- Console.WriteLine("姓名:{0}\n年龄:{1}", student.StudentName, student.StudentAge);
- // 3、调用带消息协定的操作
- Console.WriteLine("\n15乘以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("客户端接收到的回复:\n{0}", reply.ToString());
- return;
- }
- object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel)
- {
- //Console.WriteLine("客户端发送请求前的SOAP消息:\n{0}", request.ToString());
- // 插入验证信息
- MessageHeader hdUserName = MessageHeader.CreateHeader("u", "fuck", "admin");
- MessageHeader hdPassWord = MessageHeader.CreateHeader("p", "fuck", "");
- request.Headers.Add(hdUserName);
- request.Headers.Add(hdPassWord);
- return null;
- }
- object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
- {
- //Console.WriteLine("服务器端:接收到的请求:\n{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("服务器即将作出以下回复:\n{0}", reply.ToString());
- return;
- }
- }
IClientMessageInspector IDispatchMessageInspector的更多相关文章
- 重温WCF之消息拦截与篡改(八)
我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过借 ...
- WCF消息拦截,利用消息拦截做身份验证服务
本文参考 http://blog.csdn.net/tcjiaan/article/details/8274493 博客而写 添加对信息处理的类 /// <summary> /// 消 ...
- 传说中的WCF(10):消息拦截与篡改
我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过 程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过 ...
- WCF不用证书实现验证(messageheader)
上文WCF进阶:将消息正文Base64编码中介绍了实现自定义MessageInspector来记录消息和实现自定义Formatter来改写消息,本文介绍一下在WCF中使用SoapHeader进行验证的 ...
- 传说中的WCF:消息拦截与篡改
我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过借 ...
- wcf利用IDispatchMessageInspector实现接口监控日志记录和并发限流
一般对于提供出来的接口,虽然知道在哪些业务场景下才会被调用,但是不知道什么时候被调用.调用的频率.接口性能,当出现问题的时候也不容易重现请求:为了追踪这些内容就需要把每次接口的调用信息给完整的记录下来 ...
- 关于WEB Service&WCF&WebApi实现身份验证之WCF篇(2)
因前段时间工作变动(换了新工作)及工作较忙暂时中断了该系列文章,今天难得有点空闲时间,就继续总结WCF身份验证的其它方法.前面总结了三种方法(详见:关于WEB Service&WCF& ...
- WCF自定义扩展,以实现aop!
引用地址:https://msdn.microsoft.com/zh-cn/magazine/cc163302.aspx 使用自定义行为扩展 WCF Aaron Skonnard 代码下载位置: S ...
- [WCF]设置拦截器捕捉到request和reply消息
WCF进阶学习ing... 在熟练掌握了ABC的使用以后,就开始想着去了解WCF是怎么通信的了.首先是服务描述语言wsdl,它定义了服务的描述等等,用于让外界知道这个服务的ABC是什么.另外一个比较重 ...
随机推荐
- Vulnerability Scanning Tools
Category:Vulnerability Scanning Tools - OWASP https://www.owasp.org/index.php/Category:Vulnerability ...
- DbSet.Attach(实体)与DbContext.Entry(实体).State = EntityState.Modified 区别
当你使用这个DbSet.Update方法时,实体框架将你实体的所有属性标记为EntityState.Modified,所以跟踪它们.如果你只想更改部分属性,而不是全部属性,请使用DbSet.Attac ...
- Python3基础 str __add__ 拼接,原字符串不变
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- VPB测试 使用Osgdem运行例子
1.Osgdem运行例子所需数据下载地址: http://www.cc.gatech.edu/projects/large_models/ps.html Download Elevation Map: ...
- 001——Typescript 介绍 、Typescript 安 装、Typescript 开发工具
一. Typescript 介绍 1. TypeScript 是由微软开发的一款开源的编程语言. 4. TypeScript 是 Javascript 的超级,遵循最新的 ES6.Es5 规范.Typ ...
- 手机wifi连上Fiddler后无网络问题解决
早上老板交代一个任务,对一款app抓包分析下接口调用的时延.我的重新打开了一年多前用过的Fiddler(参见win10笔记本用Fiddler对手机App抓包),拿过测试手机开始设置wifi代理地址和端 ...
- 【mysql】添加删除权限
https://www.cnblogs.com/wuxunyan/p/9095016.html
- C#中 IEnumerable, ICollection, IList, List的使用
List是類,實現了IList接口,IList繼承了ICollection,ICollection繼承了IEnumerable,IEnumerable是其中最底層的接口. 實現IEnumerable接 ...
- web端自动化——unittest框架编写web测试用例
1.前言: 对于初学者来说,python自带的IDLE,精简又方便,不过一个好的编辑器能让python编码变得更方便,更加优美些. 不过呢,也可以自己去下载其他更好用的代码编辑器,在这推荐: PyCh ...
- Selenium2+python自动化2.7-火狐44版本环境搭建(转)
转载地址:https://www.cnblogs.com/yoyoketang/p/selenium.html 前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以 ...