WCF4.0支持路由机制,通过RoutingService实现请求分发、拦截处理。

  一、应用场景

  1、暴露一个endpoint在外网,其余服务部署于内网;

  2、请求分发,能对服务做负载功能;


  二、WCF4.0 路由服务

  

  图1- WCF路由示意图

    WCF RoutingService使用了消息过滤器的功能,内置定义了6个过滤器满足不同的需求:

    1、ActionMessageFilter:满足指定的操作集之一,也就操作匹配;

    2、EndpointAddressMessageFilter:满足指定的终结点地址;

    3、XPathMessageFilter:使用 XPath指定匹配的条件,用于实现基于内容路由的核心消息过滤器;

    4、MatchAllMessageFilter 与所有消息相匹配;

    5、MatchNoneMessageFilter 与所有消息都不匹配;

    对于以上默认提供的过滤器不能满足需求,还可以通过创建自己的 MessageFilter 实现消息过滤器。如下我们通过一个demo实现wcf服务分发负载处理。


  三、WCF RoutingService负载处理请求

  1、创建一个WCF服务,名称为:Aden.FK.WcfServiceA,基于console hosting实现,创建两个ServiceHost。

    (1)接口定义和实现为:

[ServiceContract]
public interface IWcfServiceA
{
[OperationContract]
int GetNumber(); [OperationContract]
string GetString();
}

    (2)服务的实现:

public class WcfServiceA : IWcfServiceA
{
public int GetNumber()
{
string msg = "Service :" + OperationContext.Current.EndpointDispatcher.EndpointAddress.Uri;
Console.WriteLine(string.Format("print: {0}", msg)); return new Random().Next();
} public string GetString()
{
string msg = "Service :" + OperationContext.Current.EndpointDispatcher.EndpointAddress.Uri;
Console.WriteLine(string.Format("print: {0}", msg)); return msg;
}
}

    (3)创建服务host:

int num = 2;
int index = 0;
List<ServiceHost> serviceHost = new List<ServiceHost>();
for (int i = 1; i <= num; i++)
{
serviceHost.Add(new ServiceHost(typeof(WcfServiceA)));
} serviceHost.ToList().ForEach(u =>
{
var netTcp = new NetTcpBinding();
netTcp.Security.Mode = SecurityMode.None;
u.AddServiceEndpoint(typeof(IWcfServiceA), netTcp, string.Format("net.tcp://127.0.0.1:910{0}/services/WcfServiceA{1}", ++index, index));
u.Open();
Console.WriteLine("{0} Service Start,Address is {1}", u.Description.Name, u.Description.Endpoints[0].Address.Uri);
}
);

  

  2、创建一个路由服务,自定义扩展实现MessageFilter进行请求分发,路由与服务之间以TCP协议传输。

            var serverEndpoints = new List<ServiceEndpoint>();
var netTcp = new NetTcpBinding();
netTcp.Security.Mode = SecurityMode.None; serverEndpoints.Add(new ServiceEndpoint(new ContractDescription("IWcfServiceA"), netTcp, new EndpointAddress("net.tcp://127.0.0.1:9101/services/WcfServiceA1")));
serverEndpoints.Add(new ServiceEndpoint(new ContractDescription("IWcfServiceA"), netTcp, new EndpointAddress("net.tcp://127.0.0.1:9102/services/WcfServiceA2"))); using (var router = new ServiceHost(typeof(RoutingService)))
{
int index = 10;
string routerAddress = "net.tcp://127.0.0.1:8101/router/routerendpoint";
router.AddServiceEndpoint(typeof(IRequestReplyRouter), netTcp, routerAddress);
var config = new RoutingConfiguration();
LoadBalancerFilter.EndpointsNumber = 2; serverEndpoints.ForEach(x => config.FilterTable.Add(new LoadBalancerFilter(), new[] { x }, index--));
router.Description.Behaviors.Add(new RoutingBehavior(config)); var debugBehavior = router.Description.Behaviors.Find<ServiceDebugBehavior>();
debugBehavior.IncludeExceptionDetailInFaults = true; if (router.State != CommunicationState.Opening)
router.Open(); while (Console.ReadKey().Key == ConsoleKey.Enter)
{
break;
}
router.Close();
}

  

  3、创建一个客户端,客户端与路由之间以TCP协议传输。

var endpoint = new EndpointAddress("net.tcp://127.0.0.1:8101/router/routerendpoint");
var netTcp = new NetTcpBinding();
netTcp.Security.Mode = SecurityMode.None;
var client = ChannelFactory<IWcfServiceA>.CreateChannel(netTcp, endpoint);
while (Console.ReadKey().Key == ConsoleKey.Enter)
{
Console.WriteLine("--" + client.GetNumber());
}

  四、运行结果

  1、客户端调用

  2、服务端显示,每次将请求分发到不同的服务处理。


  五、总结

  以上是一个简单的路由服务例子,可以根据实际情况扩展路由功能,实现上述描述是应用场景。考虑到路由的压力,可以在路由前架上Nginx负载。

作者:andon
出处:http://www.cnblogs.com/Andon_liu

关于作者:专注于微软平台项目架构、管理。熟悉设计模式、领域驱动、架构设计、敏捷开发和项目管理。现主要从事ASP.NET MVC、WCF/Web API、SOA、MSSQL、redis方面的项目开发、架构、管理工作。
如有问题或建议,请一起学习讨论!

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

如有问题,可以邮件:568773262@qq.com 联系我,谢谢。

WCF Routing 服务的更多相关文章

  1. WCF Routing服务,负载均衡

    WCF4.0支持路由机制,通过RoutingService实现请求分发.拦截处理. 一.应用场景 1.暴露一个endpoint在外网,其余服务部署于内网: 2.请求分发,能对服务做负载功能: 二.WC ...

  2. Routing 服务

    WCF Routing 服务 WCF4.0支持路由机制,通过RoutingService实现请求分发.拦截处理. 一.应用场景 1.暴露一个endpoint在外网,其余服务部署于内网: 2.请求分发, ...

  3. 如何:加载分页结果(WCF 数据服务)

    WCF 数据服务 允许数据服务限制单个响应源中返回的实体数.在此情况下,源中的最后一项包含指向下一页数据的链接.通过调用执行 DataServiceQuery 时返回的 QueryOperationR ...

  4. 微软开源 WCF 分布式服务框架,并入 .NET 基金会项目

    微软北京时间2015.5.20 在其 .NET Foundation GitHub 开源项目页中开放了 WCF 分布式服务框架的代码.WCF突然之间成为一个热门话题,在各大网站上都有不同的报道:dot ...

  5. 一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)

    JSONP(JSON with Padding)可以看成是JSON的一种“使用模式”,用以解决“跨域访问”的问题,这篇简单的文章给出一个简单的例子用于模拟如何通过jQuery以JSONP的访问调用一个 ...

  6. WCF服务与WCF数据服务的区别

    问: Hi, I am newbie to wcf programming and a little bit confused between WCF Service and WCF Data  Se ...

  7. WCF 数据服务 4.5

    .NET Framework 4.5 其他版本 WCF 数据服务(以前称为"ADO.NET Data Services")是 .NET Framework 的一个组件.可以使用此组 ...

  8. IIS上发布WCF发布服务,访问不到

    1 环境是IIS7,发布WCF发布服务,访问不到. 一种原因站点自动生成“程序应用池”和站点的Framwork版本不一致. 解决的办法:新建一个“程序应用池”,然后站点指向这个新建的“程序应用池”

  9. 使用多种客户端消费WCF RestFul服务(四)——Jquery篇

    Jquery篇 互联网开发中少不了各类前端开发框架,其中JQUERY就是最流行之一,本篇我们就采用JQUERY来消费WCF RestFul服务,其中用到JSON基础知识,如果有想了解的朋友,请访问:& ...

随机推荐

  1. 使用 Linq 对多个对象进行join操作 C#

    class A { public int id { get; set; } public string name { get; set; } } class B { public int id { g ...

  2. 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能

    下期预告: 由于很多园友反馈,有的组件不应该缺席.测试复杂度不够.测试还缺乏一定的公平. 因此考虑在下一个版本中,确保在更加公平的前提下进行更高复杂度的测试 . 同时将分为2组测试,纯SQL组件及纯O ...

  3. [MongDB] 主从架构--官方极力不推荐

    一.缘由: 看着数据库大家庭都有主从模式,想着Mongodb应该也不会落下.但从官网看来,先是早先舍弃了Master-Master模式,现在又在不推荐 Master-Slave模式,这是要标新立异呀. ...

  4. eclipse 安装svn插件

    1.下载最新的Eclipse,我的版本是3.7.2 indigo(Eclipse IDE for Java EE Developers)版    如果没有安装的请到这里下载安装:http://ecli ...

  5. 基于Material Design(转载)

    SeeNewsV2新闻Android客户端 基于Material Design http://www.codesocang.com/gn/xiangmu/33630.html 直接拿来用!十大Mate ...

  6. javascript 获取iframe中的dom

    太扯了,一个多小时都没搞定,获取不到iframe中的dom元素. <div id="one"> this is one </div> <div> ...

  7. centOS安装网卡驱动

    作为一个小白来说,安装驱动之类的真是无心下手的感觉,在学习了http://www.centoscn.com/image-text/config/2013/0816/1269.html这篇帖子的步骤之后 ...

  8. Django 后台管理设置(admin.py)

    上面是两种后台效果图,第一张是默认情况下Django的后台,第二张是稍作修改后的情况,下面记录下作了哪些修改: 代码: class ArticleAdmin(admin.ModelAdmin): li ...

  9. pip install tushare

    1.sudo apt-get install libxml2-dev libxslt1-dev python-dev apt-get install libevent-dev pip install ...

  10. iOS设计模式笔记

    设计模式 所谓设计模式,就是经过无数程序员的努力,在很多代码的基础上抽取出来的"模式" 一种设计模式,通常用来解决一种问题 MVC体系架构 也是一个设计模式,主要解决:界面(V), ...