WCF4.0新特性体验(6):路由服务Routing Service(下)
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IService1/GetData</Action>
</s:Header>
<s:Body>
<GetData xmlns="http://tempuri.org/">
<value>1</value>
</GetData>
</s:Body>
</s:Envelope>
这个是默认创建的WCF服务程序的客户端调用的SOAP消息结构。但是这个消息又是如何在服务端调用到特定的方法的呢?
- 逻辑地址:逻辑地址(“To”)是 SOAP 消息的目标地址。
- 物理地址:物理地址(“Via”)是 WCF侦听消息的实际传输特定网络地址。
- 地址过滤器:确定传入消息是否匹配端点的“To”地址和任何必需的地址标头,
- 契约过滤器:确定它是否匹配端点的契约。
- XPathMessageFilter 使用 XPath 1.0 表达式来指定匹配的条件,它是实现基于内容路由的核心消息过滤器。
- MatchAllMessageFilter 与所有消息相匹配。
- MatchNoneMessageFilter 与所有消息都不匹配。
- ActionMessageFilter 测试消息操作是否为指定的操作集之一。也就操作匹配。
- EndpointAddressMessageFilter 测试消息是否满足指定的终结点地址。
- PrefixEndpointAddressMessageFilter 对消息 URI 的前缀进行匹配,只要传入的“To”地址与端点地址有相同的地址前缀(一种松散匹配),将导致两者匹配。
public class CalculatorService : ISimpleMath, IScientif
{
// Summary:
// Defines the routing service, which is responsible for routing messages between
// endpoints based on filter criteria.
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any, InstanceContextMode = InstanceContextMode.PerSession, UseSynchronizationContext = false, ValidateMustUnderstand = false)]
public sealed class RoutingService : ISimplexDatagramRouter, ISimplexSessionRouter, IRequestReplyRouter, IDuplexSessionRouter
{
}
}
我们注意到RoutingService 类型为了支持不同的消息交换模式,实现了多个契约接口: ISimplexDatagramRouter、
IRequestReplyRouter、IDisposable。为了实现回会话路由,它也实现了ISimplexSessionRouter、IDuplexSessionRouter接口。路由服务会根据消息过滤器的条件在服务终结点之间来转发消息。也就是路由消息。
[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFServiceA
{
//操作契约
[OperationContract(Action = "SayHello", ReplyAction = "SayHelloAReply")]
string SayHello(string name);
}
//2.服务类,继承接口。实现服务契约定义的操作
public class WCFServiceA : IWCFServiceA
{
//实现接口定义的方法
public string SayHello(string name)
{
Console.WriteLine("Hello! {0},Calling at {1} ...", name,DateTime.Now.ToLongTimeString());
return "Hello ! " + name;
}
}
[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFServiceB
{
//操作契约
[OperationContract(Action = "SayBye", ReplyAction = "SayByeReply")]
string SayBye(string name);
}
//2.服务类,继承接口。实现服务契约定义的操作
public class WCFServiceB : IWCFServiceB
{
//实现接口定义的方法
public string SayBye(string name)
{
Console.WriteLine("Bye! {0},Calling at {1} ...", name,DateTime.Now.ToLongTimeString());
return "Bye ! " + name;
}
}
当然实际的项目,可以定义更为复杂的服务契约和数据契约。这里为了简单,只定义了两个服务操作。服务的托管也是Console控制台宿主托管。便于演示。
{
判断是否以及打开连接,如果尚未打开,就打开侦听端口
if (host.State != CommunicationState.Opening)
host.Open();
//显示运行状态
}
<endpoint name="EndPointA"
address="http://localhost:9001/WCFServiceA"
binding="wsHttpBinding" bindingConfiguration="WSConfig"
contract="*" />
<endpoint name="EndPointB" bindingConfiguration="netTcpConfig"
address="net.tcp://localhost:9002/WCFServiceB"
binding="netTcpBinding"
contract="*" />
</client>
<filters>
<filter name="MatchA"
filterType="Action" filterData="SayHello" />
<filter name="MatchB"
filterType="Action" filterData="SayBye" />
</filters>
<filterTables>
<filterTable name="WCFRoutingTable">
<add filterName="MatchA"
endpointName="EndPointA" />
<add filterName="MatchB"
endpointName="EndPointB" />
</filterTable>
</filterTables>
</routing>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<routing filterTableName="WCFRoutingTable" />
</behavior>
</serviceBehaviors>
<service behaviorConfiguration="ServiceBehavior"
name="System.ServiceModel.Routing.RoutingService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8001/"/>
</baseAddresses>
</host>
<endpoint address="WCFRoutingService"
binding="basicHttpBinding"
name="requestReplyEndpoint"
contract="System.ServiceModel.Routing.IRequestReplyRouter" />
</service>
</services>
<client>
<endpoint name="WCFServiceA" address="http://localhost:8001/WCFRoutingService" binding="basicHttpBinding" contract="WCFServiceA.IWCFServiceA"/>
<endpoint name="WCFServiceB" address="http://localhost:8001/WCFRoutingService" binding="basicHttpBinding" contract="WCFServiceB.IWCFServiceB"/>
</client>
</system.serviceModel>
result = channelA.SayHello("A");
Console.WriteLine("Service A:{0} !", result);
IWCFServiceB channelB = new ChannelFactory<IWCFServiceB>("WCFServiceB").CreateChannel();
result = channelB.SayBye("B");
Console.WriteLine("Service B:{0} !", result);
WCF4.0新特性体验(6):路由服务Routing Service(下)相关推荐
- WCF4.0新特性体验(3):标准终结点(Standard Endpoints)
今天在WCF4.0新特性体验第3节,我们介绍WCF4.0里的标准终结点概念,也就是Standard Endpoints. WCF4.0提供了那些标准终结点?他们有什么作用?如何使用标准终结点?如何该表 ...
- WCF4.0新特性体验(9):非破坏性队列消息接收(Non-destructive queue receive )
这次来介绍一下WCF4.0新特性体验(9):非破坏性队列接收(Non-destructive queue receive ).这个特性不是那么直观.确切来说是WCF4.0对于以前处理MSMQ消息队列机 ...
- 精进不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由
[索引页] [源码下载] 精进不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由, 自定义CacheProvider, 新增的表达式<%: expression %& ...
- 聊聊Dubbo3.0新特性之应用级服务发现
文章目录 什么是服务发现 信息孤岛问题 Http通信 微服务与Rpc框架 Dubbo2.0中的接口级服务发现 应用级服务发现 兼容性设计 Rpc元数据同步机制 性能表现 参考资料 什么是服务发现 信息 ...
- [WCF 4.0新特性] 标准终结点与无(.SVC)文件服务激活
今天介绍WCF 4.0的另外两个新特性:标准终结点(Standard Endpoint)和无(.SVC)文件服务激活(File-Less Activation).前者实现了针对典型通信场景对终结点的定 ...
- Android 4.0新特性(中文)
Android 4.0新特性(中文) 转自http://www.eoeandroid.com/thread-103300-1-1.html android4.0 SDK发布有一段时间了,在eoe上找到 ...
- Redis 6.0 新特性-多线程连环13问!
来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...
- 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API
返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...
- Redis 6.0 新特性,多线程连环 13 问!
导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安全问题? ...
最新文章
- 南京大学潘天群教授:人类智能发展的宏大叙事
- react使用moment进行日期格式化
- 如何利用python在一个文档里写入长须_Python语法入门—文件处理
- 曝鸿蒙os手表,华为Watch GT 2曝光:第一款使用鸿蒙OS的智能手表
- selenium python 安装
- DWZ富客户端框架设计思路与学习建议
- 不止命令行-自定义VS生成事件
- 缺陷管理系统mantisbt环境搭建
- 给深受【应用程序未安装】困扰并且找不到【smdl2tmp1.asec】系统的机友们
- 尼日利亚年轻人推动该国登上比特币谷歌搜索排名榜首
- AI能让全球车厂每年多赚2150亿美元 | 麦肯锡报告
- linux clock()_对比python与linux中时间管理的三件工具calender clock datetime
- 网络模型早停earlystopping详解
- RFC5731 - 中文翻译(原创)
- 电脑不限时长的录屏软件分享
- 洛谷——P1296 奶牛的耳语(java实现)
- Android iText向pdf模板插入数据和图片
- 浅谈AI设计:理解玩家们对游戏的感知方式
- 泊松分布 (Poisson-Disc)算法
- 怎样做一个好的网管?