一、利用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. how to remote debug in vs 2013

    first download the debugger tools "rtools_setup_x64" start C:\Program Files\Microsoft Visu ...

  2. sql数据库 大小查询

    select * from sys.master_files where name='CODA_PRD_Catalog' 12416*8/1024=(m)

  3. django系列5.2--ORM数据库的单表操作

    单表操作 在views.py中添加对数据库的操作语句 #在逻辑代码中导入你要操作的表 from app import models def add_book(request): ''' 添加表记录 : ...

  4. Exp3 免杀原理与实践 20164323段钊阳

    网络对抗技术 20164323 Exp3 免杀原理与实践 免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. 要做好免杀,就时清楚杀毒软件(恶意软件检测工具)是如何 ...

  5. JAVA的学习内容

    http://www.weixueyuan.net/java/rumen/ 安卓学习文档 http://www.runoob.com/w3cnote/android-tutorial-linearla ...

  6. 双绞线的制作(常用568B)

    EIA/TIA的布线标准中规定了两种双绞线的线序568A与568B 标准568A: 绿白—1  绿—2  橙白—3  蓝—4  蓝白—5  橙—6  棕白—7  棕--8 标准568B: 橙白—1   ...

  7. [javascript]——移动端 HTML5 图片上传预览和压缩

    在开发移动端web网页中,我们不可避免的会遇到文件上传的功能,但由于手机图片尺寸太大,上传时间过长导致用户体验太差,就需要在上传前对图片进行一定的压缩. 在代码之前,有必要先了解我们即将使用到的几个A ...

  8. 关于iframe切换的问题

    定位不到元素的另一种问题是有这种iframe,所有我们需要切换到该页面中去 1.首先找到这个iframe的位置,像上图有id属性我们直接  iframe = driver.find_element_b ...

  9. Tomcat和Mysql部署成Windows服务

    如题: Tomcat部署进入到Tomcat的bin目录,执行命令:service.bat install  [service_name]安装完毕后服务中能看见Apache Tomcat 7.0 [se ...

  10. Redis实现分布式存储Session

    前言: 在单个项目时,一般都是用HttpSession接口存储当前登录用户的信息.但是在分布式项目的情况下,session是不会共享的,那怎么实现session共享呢?往下看.... 一.准备工作(基 ...