WCF编程系列(三)地址与绑定
WCF编程系列(三)地址与绑定
地址
地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定。URI由通讯协议和位置路径两部分组成,如示例一中的:
http://localhost:8000/
表明通讯协议为http,位置是localhost(本机)的8000端口。
注意上述提到的消息是指一个独立的数据单元,一般由消息正文和消息头组成,而服务端与客户端的交互都是通过消息来进行的。
WCF中支持的传输协议包括HTTP、TCP、Peer network(对等网)、IPC(基于命名管道的内部进程通信)以及MSMQ(微软消息队列),每个协议对应一个地址类型:
HTTP地址
即使用HTTP协议进行传输(包括https安全传输协议)。其地址形式为
http://localhost:8000/
如果地址中为制定端口号,则默认端口为80
TCP地址
使用TCP协议进行传输,其形式为:
net.tcp://localhost:8000/
IPC地址
使用net.pipe进行传输,其形式为:
net.pipe://localhost/
MSMQ地址
使用Microsoft Message Queue机制进行传输,其形式为:
net.msmq://localhost/
对等网地址
使用net.p2p进行传输,其形式为:
net.p2p://localhost/
绑定
绑定定义终结点与外界进行通讯的方式,它由一组称为绑定元素的要素构造而成,绑定最起码应该定义传输协议(如http、TCP等)和所使用的编码方式(如文本或二进制等)
绑定元素
绑定元素表示绑定的特定部分,如传输协议、编码、基础结构级协议(如 WS-ReliableMessaging)的实现以及通信堆栈的其他任何要素。
预定义绑定
即WCF基库中提供的绑定。 这些绑定是针对特定方案进行优化的绑定元素的集合。 例如,WSHttpBinding 是为了与实现各种 WS*
规范的服务进行互操作而专门设计的。 通过仅提供那些可以正确应用于特定方案的选项,这些预定义的绑定可以节省时间。
如果预定义的绑定不能满足您的要求,则可以创建您自己的自定义绑定。示例一中我们使用了basicHttpBinding预定义绑定。
下面列表包含了当前WCF基库中预定义的所有绑定
| 绑定 | 配置元素 | 说明 | 传输协议 | 编码格式 |
| BasicHttpBinding | <basicHttpBinding> | 一个绑定,适用于与符合 WS-Basic Profile 的 Web 服务(例如基于 ASP.NET Web 服务 (ASMX) 的服务)进行的通信。 此绑定使用 HTTP 作为传输协议,并使用文本/XML 作为默认的消息编码。 | HTTP/HTTPS | Text,MTOM |
| WSHttpBinding | <wsHttpBinding> | 一个安全且可互操作的绑定,适合于非双工服务约定。 | HTTP/HTTPS | Text,MTOM |
| WS2007HttpBinding | <ws2007HttpBinding> | 一个安全且可互操作的绑定,可为 Security, ReliableSession 的正确版本和 TransactionFlow 绑定元素提供支持。 | HTTP/HTTPS | Text,MTOM |
| WSDualHttpBinding | <wsDualHttpBinding> | 一个安全且可互操作的绑定,适用于双工服务协定或通过 SOAP 媒介进行的通信。 | HTTP | Text,MTOM |
| WSFederationHttpBinding | <wsFederationHttpBinding> | 一个安全且可互操作的绑定,支持 WS 联合协议并使联合中的组织可以高效地对用户进行身份验证和授权。 | HTTP/HTTPS | Text,MTOM |
| WS2007FederationHttpBinding | <ws2007FederationHttpBinding> | 一个安全且可互操作的绑定,它派生自 WS2007HttpBinding 并支持联合安全性。 | HTTP/HTTPS | Text,MTOM |
| NetTcpBinding | <netTcpBinding> | 一个安全且经过优化的绑定,适用于 WCF 应用程序之间跨计算机的通信。 | TCP | Binary |
| NetNamedPipeBinding | <netNamedPipeBinding> | 一个安全、可靠且经过优化的绑定,适用于 WCF 应用程序之间计算机上的通信。 | IPC | Binary |
| NetMsmqBinding | <netMsmqBinding> | 一个排队绑定,适用于 WCF 应用程序之间跨计算机的通信。 | MSMQ | Binary |
| NetPeerTcpBinding | <netPeerTcpBinding> | 一个支持多计算机安全通信的绑定。 | P2P | Binary |
| MsmqIntegrationBinding | <msmqIntegrationBinding> | 一个绑定,适用于 WCF 应用程序和现有消息队列(也称为 MSMQ)应用程序之间跨计算机的通信。 | MSMQ | Binary |
显然绑定与地址是对应的:比如NetTcpBinding绑定只能使用TCP地址。而上表中所有WS开始的绑定都支持TEXT的SOAP消息编码,
这表明选择这些绑定的服务,可以由其他技术和平台使用,如Java等。而其他采用二进制SOAP编码的绑定则只支持WCF到WCF的交互。
示例二
为示例一中服务添加一个TCP绑定及IPC绑定,并在客户端中使用新的绑定调用服务
1.请将示例一的文件夹复制,将其名称修改为XfrogWCFStudy002
2.打开Host项目的App.config文件,将其内容修改如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service behaviorConfiguration="behaviorConfiguration" name="Xfrog.Study.WCF.FirstService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/" />
<add baseAddress="net.tcp://localhost:8001/" />
<add baseAddress="net.pipe://localhost/"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="Xfrog.Study.WCF.IFirstService" />
<endpoint address="" binding="netTcpBinding" contract="Xfrog.Study.WCF.IFirstService" />
<endpoint address="" binding="netNamedPipeBinding" contract="Xfrog.Study.WCF.IFirstService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfiguration">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
我们在baseAddress节点内增加了两个基地址,并新定义了两个终结点endpoint。由于绑定是和特定的协议地址对应的,所以WCF能够 根据绑定类型找到相应的基地址,即在上述配置中netNamedPipeBinding绑定会自动找到对应的net.pipe://localhost /地址。
3.在Client项目中打开App.config,将内容修改如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IFirstService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8000/" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IFirstService" contract="IFirstService"
name="BasicHttpBinding_IFirstService" />
<endpoint address="net.tcp://localhost:8001/" binding="netTcpBinding" contract="IFirstService" name="FirstServiceNetTcpEndPoint"></endpoint>
<endpoint address="net.pipe://localhost/" binding="netNamedPipeBinding" contract="IFirstService" name="FirstServiceNetNamedPipeEndPoint"></endpoint>
</client>
</system.serviceModel>
</configuration>
我们在client节点内增加了两个终结点,分别指定了终结点的地址和绑定类型,并未终结点指定了一个名称(name)
4.修改Client项目中的Program.cs代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace Client
{class Program
{static void Main(string[] args)
{String key = "";
while (String.Compare(key, "Q", true)!=0)
{FirstServiceClient client = new FirstServiceClient("BasicHttpBinding_IFirstService");Console.WriteLine("使用BASIC HTTP绑定:" + client.GetData(key));client = new FirstServiceClient("FirstServiceNetTcpEndPoint");Console.WriteLine("使用TCP绑定:" + client.GetData(key));client = new FirstServiceClient("FirstServiceNetNamedPipeEndPoint");Console.WriteLine("使用IPC绑定:" + client.GetData(key));key = Console.ReadLine();
}
}
}
}
在原有代码上,我们新实例化了两个客户端代理类,注意在调用构造时我们传入了相应在配置文件中指定的终结点名称。通过该名称WCF将使用对应的终结点来与服务端交互。
5.调试:在Host项目上单击右键,选择调试--启动新实例,待服务启动完成后,在Client项目上单据右键,选择调试--启动新实例。
是不是很简单呢?我们几乎没有编写任何代码就为以前的服务新增了两个通讯协议。有兴趣的朋友可以为服务添加其他几个ws*绑定,不过呢,由于需要相 应特定的Windows服务或特殊服务行为的支持,NetMsmqBinding、NetPeerTcpBinding及 MsmqIntegrationBinding绑定现在还无法直接添加。
Next,将介绍配置文件......
WCF编程系列(三)地址与绑定的更多相关文章
- WCF编程系列(四)配置文件
WCF编程系列(四)配置文件 .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...
- WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点 示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...
- WCF编程系列(五)元数据
WCF编程系列(五)元数据 示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...
- WCF编程系列(一)初识WCF
WCF编程系列(一)初识WCF Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念: 地址:定义服务的 ...
- WCF编程系列(七)信道及信道工厂
WCF编程系列(七)信道及信道工厂 信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...
- WCF编程系列(二)了解WCF
WCF编程系列(二)了解WCF 面向服务 服务是复用进化的结果,起初的复用是函数,面向对象编程的出现使复用从函数上升到对象,随后面向组件编程又将复用从对象上升到组件,现在面向服务编程将复用 ...
- WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】
http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...
- [Python] 文科生零基础学编程系列三——数据运算符的基本类别
上一篇:[Python] 文科生零基础学编程系列二--数据类型.变量.常量的基础概念 下一篇: ※ 程序的执行过程,就是对数据进行运算的过程. 不同的数据类型,可以进行不同的运算, 按照数据运算类型的 ...
- 022年9月12日 学习ASP.NET Core Blazor编程系列三——实体
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
随机推荐
- VB.Net中点击按钮(Button)会重复提交两次表单
在VB.NET程序开发过程中遇到一个问题 提交一个表单时,button的html代码如下 <asp:Button ID="btnSubmit" OnClick="c ...
- windows程序员进阶系列:《软件调试》之堆 (一)
windows程序员进阶系列:<软件调试>之堆 (一) 堆是软件在运行时动态申请内存空间的主要途径.从堆上申请来的空间需要程序员自己申请和释放,且申请和释放操作必须绝对匹配.忘记释放或者多 ...
- emWin -- 模拟器系列1 - 如何建立模拟器开发环境
面对如此强大的emWin,大家是否都有跃跃欲试的冲动呢?但是没有硬件可以调试的童鞋,难道只能望洋兴叹?非也.非也.Segger公司早就考虑到了.Segger推出模拟器的目的不仅仅是为了解决没有硬件的烦 ...
- Android设计模式系列-单例模式
单例模式,可以说是GOF的23种设计模式中最简单的一个. 这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式, ...
- cocos2d-x 触摸偏移
转自:http://www.cnblogs.com/fjut/archive/2012/04/28/2475693.html //ccTouchBegan必须实现,否则会报错 bool PicScan ...
- 字母A-Z写法
#大写的a-z,ASCII编码 65..90|%{[char]$_} #小写的A-Z 97..122|%{[char]$_} 方法二: ([char[]](97..122) -as [ ...
- 【25】考虑写出一个不抛异常的swap函数
1.swap交换对象值,std提供了实现方法模版的实现,它的实现是交换对象值. namespace std { template<typename T> void swap(T& ...
- css3 字体旋转
<style> #mycon { font-weight: bold; font-size: 150px; transform: rotateX(10deg); -webkit-trans ...
- SQL Server 性能优化3 该指数(Index)保养
前言 之前的一篇文章介绍了索引来提高数据库的查询性能,这其实仅仅是个开始.也许假设缺乏适当的保养,索引你以前建立的,甚至成为拖累,成为帮凶下降数据库的性能. 寻找碎片 消除碎片索引维护可能是最常规的任 ...
- iOS开发:AVPlayer实现流音频边播边存
1. AVPlayer简介 AVPlayer存在于AVFoundation中,可以播放视频和音频,可以理解为一个随身听 AVPlayer的关联类: AVAsset:一个抽象类,不能直接使用,代表一个要 ...