一、利用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. Thread类

    Thread类相对于线程池中的线程,使用者有更多的控制权.该类允许创建前台线程,设置线程优先级等.Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadSta ...

  2. 一次mysql调优过程

    由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 :  --> 点击这里 前几天进行了一个数据库查询,比较缓慢,便查询了一下,在这里记录一下,方便 ...

  3. Java中Io类-File类的构造方法

    package com.hxzy.IOSer;import java.io.*;public class Demo02 { public static void main(String[] args) ...

  4. 查域名对应的ip的命令:Nslookup

    使用Nslookup命令可查询域名对应的ip,如下所示

  5. springboot集成JsonRpc2.0

    导入依赖的jar: 配置AutoJsonRpcServiceImplExporter: 接口文件: 实现类: 测试:

  6. TPS和QPS定义以及影响TPS的因素

    一.TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数.TPS包括一条消息入和一条消息出,加上一次用户数据库访问.(业务TPS = CAPS × ...

  7. Linux 服务器加入Windows AD

    背景信息: Windows AD Version: Windows Server 2012 R2 zh-cn 计算机全名:hlm12r2n1.hlm.com 域:hlm.com 域控管理员:stone ...

  8. TX2 i2c-tools使用

    安装: apt-get install libi2c-dev i2c-tools 检测i2c总线数目 用i2cdetect检测有几组i2c总线在系统上: i2cdetect -l 可以看到系统中有9组 ...

  9. jenkins运行Python

    法一: 配置中构建执行Windows批处理命令如下 立即构建后,报错如下,提示python 不是内部或外部指令 修改Windows批处理指令如下: 再次“立即构建”则正常 法二: 安装Python插件 ...

  10. 配置不同站点不同版本PHP

    Apache 配置 1.常规手动部署apache方法(不会apache配置的请先移步看下Apache基本手工配置方法),解压fcgid,取其mod_fcgid.so至modules目录 2.打开htt ...