WCF-终结点之消息路由示例

一、

在前一章中主要介绍了服务端的监听地址与逻辑地址。本节模拟消息转发机制来实际体验一把终结点的监听地址是如何使用的。

先下载一个叫做TcpTrace的小软件(108k),它能够截取端口消息,并转发消息。

先来看看服务端代码,服务端的绑定使用WS2007HttpBinding的不加密模式,因为我们等会还要看TcpTrace捕获的数据明文,所以不能加密。客户端也是使用不加密的WS2007HttpBinding。

using System.ServiceModel;using System.ServiceModel.Description;using System.ServiceModel.Channels;namespace host{    class Program    {        static void Main(string[] args)        {            using (ServiceHost host = new ServiceHost(typeof(mywcf.Calculator)))            {                WS2007HttpBinding bind = new WS2007HttpBinding();                WSHttpSecurity security = new WSHttpSecurity();                security.Mode = SecurityMode.None;                bind.Security = security;                host.AddServiceEndpoint(typeof(mywcf.ICalculator), bind, "http://localhost:8888");                host.Opened += delegate { Console.WriteLine("Service Start!"); };                host.Open();                Console.ReadLine();            }        }    }}

服务端发布一个终结点。由前一章说道,默认逻辑地址与监听地址一致,都是http://localhost:8888。

客户端代码如下:

using System.ServiceModel;using System.ServiceModel.Description;using System.ServiceModel.Channels;namespace client{    class Program    {        static void Main(string[] args)        {            WS2007HttpBinding bind = new WS2007HttpBinding();            WSHttpSecurity security = new WSHttpSecurity();            security.Mode = SecurityMode.None;            bind.Security = security;            EndpointAddress endpint=new EndpointAddress("http://localhost:8888");            mywcf.ICalculator client = ChannelFactory<mywcf.ICalculator>.CreateChannel(bind, endpint, new Uri("http://localhost:9999"));            Console.WriteLine(client.Add(1, 2));        }    }}

先启动服务端,再启动客户端。客户端报了一个错误,无法找到正确的终结点。

客户端的访问的逻辑地址为http://localhost:8888,监听地址为http://localhost:9999。但是服务端监听的是8888,并没有监听9999,所以访问失败。我们现在利用TcpTrace工具,把服务端9999端口收到的消息转发至服务端8888端口,服务端就能够正确的接收到请求。

点击OK,现在再次先后启动服务端和客户端,访问成功,并且已经成功转发。

现在分析一下消息内容。客户端请求<To>报头为逻辑地址为localhost:8888,目标地址为localhost:9999,<Body>为x=1,y=2,请求Add操作。下面服务端返回成功,<AddResult>为3。正因为客户端的<To>逻辑地址与服务端的逻辑地址一致,才可以通过终结点的消息筛选器。

二、

若服务端代码不变,服务端的逻辑地址和监听地址依然是8888,现在将客户端的逻辑地址和监听地址都设置为9999,再通过TcpTrace转发,将9999端口消息转发到8888端口。

客户端代码如下:

using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
namespace client
{
    class Program
    {
        static void Main(string[] args)
        {
            WS2007HttpBinding bind = new WS2007HttpBinding();
            WSHttpSecurity security = new WSHttpSecurity();
            security.Mode = SecurityMode.None;
            bind.Security = security;
            EndpointAddress endpint=new EndpointAddress("http://localhost:9999");
            mywcf.ICalculator client = ChannelFactory<mywcf.ICalculator>.CreateChannel(bind, endpint);
            Console.WriteLine(client.Add(1, 2));
        }
    }
}

先后运行客户端与服务端,发现报了一个异常。

再来看看TcpTrace截取的请求消息:

<To>报头地址的端口变成了9999。即使TcpTrace进行了转发,因为逻辑地址不匹配,这样的消息无法通过服务端终结点的地址筛选器。

三、
如果想让上述客户端能够正常访问服务端。在自定义的类库的服务行为将AddressFilterMode设置成AddressFilterMode.Any,即使请求的<To>逻辑地址与服务端终结点逻辑地址不一致也可以访问。

using System.ServiceModel;
namespace mywcf
{
    [ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
    public class Calculator : ICalculator
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}
时间: 2024-10-17 22:00:36

WCF-终结点之消息路由示例的相关文章

WCF初探-21:WCF终结点(endpoint)

WCF终结点概述 在之前文章的示例中,我们都是通过配置服务的终结点(endpoint)发布的服务,供客户端调用,这是因为WCF服务的所有通信都是通过该服务的终结点进行的.每个终结点(endpoint)包含四个属性. 一个指示可以查找终结点的位置的地址. 一个指定客户端如何与终结点进行通信的绑定. 一个标识可用操作的协定. 一组指定终结点的本地实现细节的行为. 终结点的结构 WCF服务终结点(endpoint)通信结构 终结点(endpoint)的组成内容 终结点地址 每个终结点都具有与其关联的地

【.net 深呼吸】记录WCF的通信消息

前面老周给大伙伴们介绍了把跟踪信息写入日志文件的方法,今天咱们换个类似的话题来扯一下,对了,咱们就说说怎么把WCF的往来消息log下来吧. 尽管在现实生活中,我们不主张偷窥他人信息,不过,偷窥程序信息是一件很快乐的事. 在很多情况下,WCF是用SOAP来完成数据交换的,SOAP是啥,网上搜一搜叫知道了,不要太在意概念,不懂的概念就网上搜,搜到后大致看一下即可. 要是能把WCF服务的每轮通信的SOAP消息记录下来,除了有助于管理服务外,其实还可以帮助我们了解WCF的调用过程(可以看到它与客户端的往

Azure IoT Hub 十分钟入门系列 (3)- 使用消息路由将原始设备数据记录存档

本文主要分享一个案例: 10分钟使用消息路由将原始设备数据记录存档 B站视频讲解:https://www.bilibili.com/video/av90223893/ 本文主要有如下内容: 1.理解什么是消息路由,为什么要用消息路由 2.消息路由的类型 3.配置一个到Storage的消息路由,将原始设备消息存储到blob 4.配置一个到Storage的消息路由,当温度>30°C时,才存储下来 图文讲解: 本文参照官网:https://docs.azure.cn/zh-cn/iot-hub/tut

MSDN 提供的有关 Windows Communication Foundation (WCF) 的各个方面的示例说明

有关 Windows Communication Foundation (WCF) 的各个方面的示例说明: https://www.microsoft.com/en-us/download/details.aspx?id=21459 或者:http://files.cnblogs.com/files/djdq/WF_WCF_Samples.part01.rar 和 http://files.cnblogs.com/files/djdq/WF_WCF_Samples.part02.rar 或者:(

MFC消息路由

1.Command Routing(命令传递):当消息进来时,会有一个泵推动它前进.消息如何进来,以有泵函数如何推动,都是属于windows程序设计的范畴, 消息如果是从子类流向父类(纵向流动),那么事情再简单不过,整个message map消息映射表已规划出十分明确的路线.消息应该有横向流动的机会,MFC对于消息循环的规定是: 如果是一般的windows消息(WM_XXX),则一定是由派生类流向基类,没有旁流的可能. 如果是命令消息(WM_COMMAND),那就有奇特的路线了.   2.消息映

基于NIO的消息路由的实现(四) 服务端通讯主线程(1)

一.简单介绍: 服务端通讯主线程是消息路由服务的启动类,其主要作用如下: 1.初始化相关配置: 2.根据配置的ip和port创建tcp服务: 3.接收客户端连接,并给客户端分配令牌: 4.接收客户端的登录请求,并将客户端相关信息(令牌.客户端登录标识.最后访问时间.当前token所使用的通道,保存到缓冲区) 5.接收客户端的报文请求,并添加到通讯队列,等待处理: 6.接收来自各处的指令发送请求,并发送至相关通道: 二.详细介绍: 1.启动方法:首先加载配置信息:然后启动主线程.通讯报文消费线程(

Windows Communication Foundation (WCF)和Windows CardSpace的示例程序

微软公司昨天发布了一个Windows Communication Foundation (WCF)和Windows CardSpace的示例程序包,内容极为丰富,从最简单的Hello World到复杂的解决方案一应俱全.对于Windows Communication Foundation (WCF)和Windows CardSpace这两个新东西而言,这些示例程序无疑就是最好的学习资源. 下载地址:http://www.microsoft.com/downloads/details.aspx?F

[老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端与客户端在通信时有三种模式:单向模式.请求/应答模式和双工模式. 如果选用了单向模式,调用方在向被调用方进行了调用后不期待任何回应,被调用方在执行完调用后不给调用方任何反馈.如客户端通过单向模式调用了一个服务端的操作后,就去干别的了,不会等待服务端给他任何响应,他也无从得知调用是否成功,甚至连发生了

(8)WSO2 ESB功能——消息路由

这篇文章介绍如何通过WSO2 ESB实现消息路由的功能:基于内容的路由,根据消息内容的不同路由到不同的服务进行处理. 场景:投诉管理 描述:公众发起对律师或公证员的投诉,输入0转到律师服务进行处理,输入1转到公证员服务进行处理,其他值转到默认服务进行处理 3个服务:律师服务.公证员服务.默认服务 1 三个Axis2服务 默认服务Route:http://10.22.1.20:9763/services/Route?wsdl package service.hello.ws.demo.com; p