一、利用BasicHttpBinding实现消息通信

WCF基础架构由服务模型层和信道层构成,而绑定是两层直接的纽带。绑定创建了处理消息的信道栈,实现消息的传输和处理。在绑定模型中涉及很多通信对象,信道监听器、信道工厂等,它们处于一个层链表中,层链表的每一层都是一个单链表维护自己的消息处理关系和信道关系。当创建信道监听器时触发了监听器层的链表,一并创建基于不同信道的不同信道管理器,再由这些信道管理器创建各自的信道。

废话少说,上代码,服务端:

class Program
{
static void Main(string[] args)
{
BasicHttpBinding bind = new BasicHttpBinding();
IChannelListener<IReplyChannel> listener = bind.BuildChannelListener<IReplyChannel>(new Uri("http://localhost:8866"));
listener.Open();
IReplyChannel replyChannel = listener.AcceptChannel(TimeSpan.MaxValue);
replyChannel.Open(); while (true)
{
RequestContext context = replyChannel.ReceiveRequest(TimeSpan.MaxValue);
Message msg = context.RequestMessage;
Console.WriteLine(msg);
context.Reply(CreateMessage(bind));
}
}
private static Message CreateMessage(Binding bind)
{
XNamespace ns = "http://www.cnblogs.com/lh218";
XElement body = new XElement(new XElement(ns + "Response", new XElement(ns + "result", 3)));
return Message.CreateMessage(bind.MessageVersion, "http://www.cnblogs.com", body);
}
}

BasicHttpBinding首先创建了一个信道监听器,Open之后创建信道,在while循环中接受客户端的消息。ReceiveRequest方法中传入一个TimeSpan类型参数表示等待时间间隔。网络通信需要时间,倘若等待一定长的时间后没有收到消息可以抛出异常,这个参数就是定义这个时间范围,这里传入最大值表示无限等待。接受到消息后返回的是RequestContext对象,可以通过它获取消息和回复消息。
客户端:

class Program
{
static void Main(string[] args)
{
BasicHttpBinding bind = new BasicHttpBinding();
IChannelFactory<IRequestChannel> request = bind.BuildChannelFactory<IRequestChannel>();
request.Open();
IRequestChannel requestChannel=request.CreateChannel(new EndpointAddress("http://localhost:8866"));
requestChannel.Open();
Message msg= requestChannel.Request(CreateMessage(bind));
Console.WriteLine(msg);
} private static Message CreateMessage(Binding bind)
{
XNamespace ns = "http://www.cnblogs.com/lh218";
XElement body = new XElement(new XElement(ns + "Request", new XElement(ns + "x", 1), new XElement(ns + "x", 2)));
return Message.CreateMessage(bind.MessageVersion, "http://www.cnblogs.com", body);
}
}

创建信道工厂,Open,在创建信道,Open,创建信道后就可以直接发送消息了。这里定义了一个静态方法CreateMessage用于创建消息,从消息内容上看可以很容易的看出来客户端发送请求想知道1+2等于多少,服务端回复等于3。当然这些消息都是自己创建的,当真正调用一个实现了契约的方法,这些消息的创建都是WCF内部自动完成的。

客户端发送的消息:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addr
essing/none">http://localhost:8866/</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/
addressing/none">http://www.cnblogs.com</Action>
</s:Header>
<s:Body>
<Request xmlns="http://www.cnblogs.com/lh218">
<x>1</x>
<x>2</x>
</Request>
</s:Body>
</s:Envelope>

服务端回复消息:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header />
  <s:Body>
    <Response xmlns="http://www.cnblogs.com/lh218">
      <result>3</result>
    </Response>
  </s:Body>
</s:Envelope>

WCF-绑定模型(一)的更多相关文章

  1. WCF绑定类型选择

    WCF绑定类型选择   发布日期:2010年12月10日星期五 作者:EricHu   在开发WCF程序时,如何选择一个适合的绑定对于消息传输的可靠性,传输模式是否跨进程.主机.网络,传输模式的支持. ...

  2. WCF绑定netTcpBinding寄宿到IIS

    继续沿用上一篇随笔中WCF服务类库 Wettery.WcfContract.Services WCF绑定netTcpBinding寄宿到控制台应用程序 服务端 添加WCF服务应用程序 Wettery. ...

  3. WCF - 绑定

    从整个基础架构来看 WCF可分为服务模型层和信道层 模型层提供了一个统一的可扩展的编程模型 而信道层提供了对请求信息的接收和处理 而作为WCF通信的三要素之一的绑定 是它实现了组成整个信道层的信道栈 ...

  4. wcf实例模型(随记)

    -----------------------------------------实例模型: 1.InstanceContentextMode: -------PerCall(单调):无状态,每次调用 ...

  5. WCF绑定和行为在普通应用和SilverLight应用一些对比

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 阅读目录 介绍 绑定 普通应用和SilverLight应用区别 本文版权归mephisto和博客园共有, ...

  6. WCF 绑定的选择

    选自<WCF服务编程中文版> 第一章 WCF基础 绑定服务之间的通信方式是多种多样的,有多种可能的通信模式.包括:同步的请求/ 应答(Request/Reply)消息,或者异步的“即发即弃 ...

  7. WCF 绑定(Binding)

    绑定包含多个绑定元素 ,它 们描述了所有绑定要求 .可以创建自定义绑定 ,也可以使用下表中的其中一个预定义绑定 : 不同的绑定支持不同的功能.以Ws开头的绑定独立于平台 ,支持 Web服务规范. 以 ...

  8. WCF - 绑定后续之自定义绑定

    自定义信道基类 WCF是一个极具扩展性的通信框架 无论在服务模型层还是信道层 都具有很多扩展点 而信道层的扩展点主要体现在实现自定义信道以增强信道栈处理信息的能力 比如我们可以扩展信道层 实现一个自定 ...

  9. wcf并发处理模型(随记)

    ---------------------------------------------------------------------------------------并发性课程:1.多个线程同 ...

  10. EntityFramework Core 自动绑定模型映射

    笔者最近在和同事共同开发项目时,需要从他们提供的包含数据库实体类型的类库中读取实体信息绑定到自己的项目中(但是都在同一个解决方案里),所以很直接的一种方式就是把项目中所有的实体都以 public Db ...

随机推荐

  1. C#冒泡排序(完整代码)

    百度百科 冒泡排序是笔试面试经常考的内容,虽然它是这些算法里排序速度最慢的 原理:从头开始,每一个元素和它的下一个元素比较,如果它大,就将它与比较的元素交换,否则不动. 这意味着,大的元素总是在向后慢 ...

  2. C++并发多线程(一)

    并发:两个或者更多的任务同时发生,一个程序同时执行多个独立的任务. 以往计算机 单核CPU 某一个时刻只能执行一个任务 由操作系统调度 每秒钟进行多次所谓的任务切换并发的假象(不是真正的并发),这种切 ...

  3. WPF显示Gif动画

    WPF的Image控件不能很好的支持.gif文件.解决办法有如下2种. 1使用MediaElement <MediaElement Source="file://D:\anim.gif ...

  4. Dapper.Contrib.Extensions问题

    Dapper.Contrib.Extensions问题 Dapper.Extension.1.0.0.1\lib\net45\Dapper.Extension.dll Dapper.Contrib.1 ...

  5. DS作业01--日期抽象数据类型设计与实现

    第六次作业 1.思维导图及学习体会 1.1 思维导图 1.2 学习体会 因为假期里面代码的练习量很小,所以开学来上学期的知识遗忘了很多,刚刚开始写大作业的时候很困难,完全没有思路,后来看了几位同学的代 ...

  6. BZOJ 1412--狼和羊的故事(最小割)

    1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3316  Solved: 1664[Submit][St ...

  7. PHP中count()和sizeof()

    php中获取数组长度函数有两个count()和sizeof(),如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组元素个数就是0.两函数功能一样,手册上讲,sizeof() ...

  8. 《Spark MLlib 机器学习实战》1——读后总结

    1 概念 2 安装 3 RDD RDD包含两种基本的类型:Transformation和Action.RDD的执行是延迟执行,只有Action算子才会触发任务的执行. 宽依赖和窄依赖用于切分任务,如果 ...

  9. ava Maven项目之Nexus私服搭建和版本管理应用

    目录: Nexus介绍 环境.软件准备 Nexus服务搭建 Java Maven项目版本管理应用 FAQ 1.Nexus介绍 Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维 ...

  10. re 模块 常规方法使用

    前情提要: re模块主要用于正则,用的好了秒杀一切匹配的规则,这里主要是介绍基本用法 一:元字符 1:\w 匹配字符,包含中文,数字或下划线 l ='早乙女露依 123 是我的 321 心目中的 22 ...