下面主要通过项目实例来具体阐述如何实现wse路由和一些项目开发中的细节。本人水平有限,有不对的地方,请朋友们不吝赐教。

在开始项目之前,先了解一下路由的概念,所谓"路由",是指把数据从一个地方传送到另一个地方的行为和动作,它通常包括两种行为:选择最佳路径和通过网络交换数据。我们平时使用的路由器就是为了此项功能而产生的机器。那么wse为何要具备路由的功能呢?这个必须是我们首先要弄明白的问题。

对SOA不了解或者没有相关开发和运维经验的朋友可能体会不出wse为何要有路由功能的理由,从表面看来,完全没必要嘛!客户端指定一个服务端,双方交换数据就可以了!非也,在SOA中,要面对的往往是部门与部门之间,企业与企业之间,机构与机构之间的系统协作问题,此时如果提供服务的一方出现维修问题,会影响到很多客户端,而这些客户端可能分布在不同的个人或者机构中,中间一些协调和沟通问题会很快让你进入hell,而有些客户端系统对于系统的稳定性要求极高。所以如果服务端不做伤筋动骨的改动,应该尽最大可能保持客户端的正常运行。Wse的路由功能就是为了解决此类问题的方案之一。一句话它能够使服务端能够在对服务进行维护的时候,经过简单的配置,改变soap消息的原有路由,从而保证客户端的稳定运行。

要实现wse的路由功能,有两种手段:第一是通过配置文件,这个配置文件在wse框架中被称为referral cache.另外一种是基于soap消息内容来实现。本文首先解决如何通过配置文件来实现wse路由。

  • 通过配置来实现wse路由

实现wse路由,需要两个大的步骤:

  1. 准备一台路由服务器(以后我们称之为R),并对其进行配置
  2. 配置一个Referral Cache,这个文件定义了soap消息的路由信息

我们通过以下情景来实现项目演示:目前我们存在一个服务,所在服务器为S1,因为路由对客户端没有影响,所以我们只模拟一个客户端,服务器为C,我们目前的路由情况如下图所示:

首先我们看一下使用了路由的网络服务,路由,和客户端程序的特点。

网络服务:使用了路由的网络服务必须接受来源于路由服务器R的请求,因此需指定网络服务的SoapActor Attribute,为路由的URL或者接受所有的来源。有关SoapActor的描述如下:一个SOAP消息从始节点到终节点的过程中,可能沿着消息路径经过一系列SOAP中间节点。一个SOAP中间节点是一个可以接收转发SOAP消息的应用程序。中间节点和终节点由URI区分。可能SOAP消息的终节点并不需要所有部分,而在消息路径上的一个和几个中间节点可能需要这些内容。头元素的接收者扮演的角色类似于一个过滤器,防止这些只发给本接受者的消息部分扩散到其它节点。即一个头元素的接收者必须不转发这些头元素到SOAP消息路径上的下一个应用程序。同样的,接收者可能插入一个相似的头元素。SOAP actor全局属性可以用于指示头元素的接收者。SOAP actor属性的值是一个URI。省略SOAP actor属性表示接收者是SOAP消息的终节点

对网络服务的创建和设计需要注意的地方如下图:

除了此处,网络服务和其他的使用wse3.0的服务,没有区别。

再看一下路由,路由程序是一个非常特殊的程序,他可以没有任何程序,只包含两个配置文件,这里主要讲述一下如何设置这两个配置文件

  1. 首先我们先对创建的路由网站做wse设置,可以采用wse与vs2005的集成工具。如下图所示:

    这样就添加了对Microsoft.Web.Services3的引用,需要注意的是,web.config中添加引用的部分必须类似如下

    因为这个项目没有bin目录,当然如果您打可sp1的补丁,添加引用后,bin目录会有相关dll,是不需要如上图所示的。我这里创建的是网站,所以必须如此,因为没有这个网站将无法使用wse,也就无法实现路由的功能了。

对路由网站的设置还包括如下操作,它为web.config添加了一个HttpHandler,用于处理http请求,您可以自定义HttpHandler,也可以使用wse3.0默认提供的Microsoft.Web.Services3.Messaging.SoapHttpRouter,添加方法如下:

点击确定后

经过上面的操作,会在web.config添加如下的代码:

您也可以手动添加。

  1. 创建一个referral cache文件,在里面写路由配置,如下:

    下面说明一下各个节点的意义:

    <r:referrals>节点是根节点。在一个配置文件中有且只有一个。

    <r:ref>节点用于标识一个特定的路由配置,在一个配置文件中可有可无,也可以是多个

    <r:for>节点用于指示来源消息的部分信息

    <r:exact>节点用于指定一个来源信息的详细信息,一个<r:for>必须包含一个<r:exact>或者<r:prefix>

    <r:if>节点指定路由的条件,一个<r:for>必须有一个<r:if>

    <r:go>节点指示重定向的一些信息,一个<r:ref>一个<r:go>

    <r:via>节点指示消息重定向到的url地址,一个<r:go>至少一个<r:via>

    <r:refId>节点指示路由配置的唯一标识

    设置好referral cache后,需要做如下的设置:

    点击确定后,在web.config添加如下代码:

    部署路由站点的时候,一定要注意要对referral cache给网络用户(IIS6.0中是network service)设置文件写权限,这个是必须的,不要忘记

    对于客户端而言,和其他客户端没有区别,只是将消息的发送地址设置为路由地址。设置方式如下:

    此时,启动客户端程序,便可以出现如下图所示的结果:

    表明如第一张图中所示的三个部分都已经正常工作了。

    下面模拟一下路由的优点,当运行网络的服务器S1需要维修或者系统需要升级的时候,我们可以按照以下的步骤来进行操作:

    第一步:准备好一个备用服务器S2,将S2上部署一个和S1上一样的环境,并部署网络服务程序。

    第二步:准备另外一个referral cache配置文件,将其中的<r:go>中的信息更改为S2上服务的Url地址。

    第三部:用新的referral cache文件替换路由服务器R上的referral cache

    经过这三步,客户端可以没有任何的改动和影响。消息可以照常发送,但实际的接收方已经变为了S2.

    运行客户端,我们有得到了我们期待的结果

    限于条件所限,本文中在一台机器中模拟客户端,路由,和服务端,下载到本地的程序需要更改url才能运行

还可以通过更改Soap消息内容来实现此种功能,留作下一篇做阐述。

文章来自网络转载

soap 路由的更多相关文章

  1. soap消息机制 讲解

    SOAP(Simple Object Access Protocol,简单对象访问协议)作为一种信息交互协议在分布式应用中非常广泛,如WebService.在使用.Net开发WebService时候, ...

  2. SOAP详解

    1. SOAP简介 1.1应用背景 对于应用程序开发来说,使程序之间进行因特网通信是很重要的.目前的应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,但是 H ...

  3. 如何在symfony 控制器里面创建soap web service

    通过一些工具将一个控制器设置成一个soap服务将会非常简单.首先,你必须安装了php soap扩展.由于php soap扩展现在不能生成wsdl,你要么自己从头开始创建要模使用第三方生成器. php中 ...

  4. Magento WebServices SOAP API 创建和使用

    首先 SOAP 简介: http://baike.baidu.com/view/1695890.htm?fromtitle=SOAP 然后简单介绍下Magento API.Magento API干啥用 ...

  5. 透析SOA、RPC、SOAP、REST、ICE、ESB模型发展史

    最初的程序全是单机程序,没有网络,没有RPC,更没有RESTful.程序猿写的东西孤独运行在单机上. 那时的程序猿们语言相通,参与开发同一套系统的团队可以面对面沟通. 网络出现了.网络,也带来变乱.网 ...

  6. API接口设计,rest,soap

    REST之前的重要协议SOAP rest(简单理解风格.约束.设计理念) rest之前是SOAP:SOAP Web API采用RPC风格,它采用面向功能的架构,所以我们在设计SOAP Web API的 ...

  7. 由SOAP说开去 - - 谈谈WebServices、RMI、RPC、SOA、REST、XML、JSON

    引子: 关于SOAP其实我一直模模糊糊不太理解,这种模模糊糊的感觉表述起来是这样: 在使用web服务时(功能接口),本来我就可以通过安卓中固有的http类(使用http协议),来发送http请求,并且 ...

  8. SOAP协议初级指南 (一)

    SOAP(Simple Object Access Protocal) 技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问.SOAP是把成熟的基于HTTP的WEB技 ...

  9. 关于wcf,webservice,webapi或者其他服务或者接口有什么区别 WCF、WebAPI、WebService之间的区别 【转载】HTTP和SOAP完全就是两个不同的协议 WebService学习总结(一)——WebService的相关概念

    wcf,webservice采用的是rpc协议,这个协议很复杂,所以每次要传递.要校验的内容也很复杂,别看我们用的很简单,但实际是frame帮我们做掉了rpc生成.解析的事情webapi遵循是rest ...

随机推荐

  1. android ListView的怪异现象

    我们已经知道,当条目没显示一次,那个类重写的最后一个函数就执行一次,但是现在,发生了怪异现象!当窗体的属性设置为包裹的时候,会重复显示多次,所以,高度,宽度都要设置为充满类型才可以

  2. 关于MD5加密的小知识

    - (NSString *)MD5Hash { const char *cStr = [self UTF8String]; unsigned char result[16]; CC_MD5(cStr, ...

  3. Tabbar视图切换,返回上一视图,添加item

    前面有一篇博文iOS学习之Tab Bar的使用和视图切换 这是在AppDelegate里使用Tabbar,这样的程序打开就是TabbarView了,有时候我们需要给程序做一些帮助页面,或者登录页面,之 ...

  4. Mentor PADS 9.5下载安装及破解指南

    Pads,是一款用于设计.模拟电子线路及设计电路板的电脑软件,原由Innoveda公司开发,其后改名为PowerPCB,在2002年4月Innoveda被Mentor Graphics收购,近年再次改 ...

  5. 自己手写简约实用的Jquery tabs插件(基于bootstrap环境)

    一直想改版网站首页的图书展示部分,以前的展示是使用BootStrap的传统的collapse,网页篇幅占用大,也不够美观,操作也相对来说比较麻烦.于是有了自己利用Jquery来做一个图书展示的tabs ...

  6. 将double类型的值保留几位小数

    1.第一个参数(3.1415926)是要处理的数值.第二个参数(1)为要保留的几位小数.第三个参数是按照“四舍五入”还是"直接取这一位的值"(MidpointRounding.To ...

  7. Docker无法启动 Could not find a free IP address range for interface 'docker0' 最方便的解决办法

    阿里云的CentOS 6.5上安装Docker会无法启动,如果直接运行docker -d会看到错误提示:Could not find a free IP address range for inter ...

  8. apache配置VirtualHost(windows)

    以下方式适合原生 Apache, XAMPP 和WAMP 套件. 1. 打开目录 {Apache2 安装目录}\conf\extra\, 找到 httpd-vhosts.conf 文件. 2. 仿照例 ...

  9. Linux 挂载存储方法

    申请的虚拟机因总宕机,处理完之后多分配了我100G空间,还是狠讲究的嘛,挂载方法如下: 初始磁盘挂载情况:[root@wmstest ~]# df -hFilesystem Size Used Ava ...

  10. Python标准库 urllib2 的使用

    1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy,而不受环境变量的影响,可以使用下面的方式 impo ...