WCF入门
预备知识
XML
1.概念:
XML(Extensible Markup Language,可扩展的标记语言)是一套用文本来定义语义标记的元标记语言,具有与平台无关、可灵活的定义数据和结构信息、便于网络传递等优势。
2.特点:
①XML是文本编码,可在任何网络中正常传输。
~~不受所选用的操作系统、对象模型和编程语言的影响
②XML中的所有标记都是自定义的,通过这些自定义的标记,可描述某种数据的不同部分及其嵌套的层次结构。
③XML规定所有标记都必须有开始和结束标志。
3.XML例子
2.Web服务的体系结构基于服务提供者、服务请求者、服务注册中心三个角色,利用发布、发现、绑定三个操作来构建的。
3.Web服务涉及:
SOAP(Simple Object Access Protocol):
~~定义了客户端与Web服务交换数据的格式。
~~SOAP是一种基于XML的,以HTTP作为基础传输协议的信息交换协议。
WADL(Web Service Description Language):
~~描述Web服务提供的方法以及调用这些方法的各种方式。
~~通过WSDL,可描述Web服务的3个基本属性:
1)服务完成什么功能。即指出Web服务提供了哪些方法。
2)如何访问服务。客户端和Web服务交互的数据格式以及必要的协议。
3)服务位于何处。指出与Web服务所用协议相关的地址。如URL、UDDI(Universal Description,Discovery, and Integration)等。
4.客户端与Web服务通信的过程
阶段1:序列化:
(1)客户端应用程序创建Web服务代理类的一个实例。
(2)客户端应用程序调用代理类的方法。
(3)客户端基础架构将Web服务所需要的参数序列化为SOAP消息,并通过网络将其发送给Web服务器。
阶段2:反序列化
(4)Web服务器接收SOAP消息并反序列化该XML,同时创建实现Web服务的实例,再调用Web服务提供的方法,并将反序列化后的XML作为参数传递给该方法。
(5)Web服务器执行Web服务提供的方法,得到返回值和各种输出参数。
阶段3:序列化
(6)Web服务器将返回值和输出参数序列化为SOAP消息,并通过网络将其返回给客户端基础架构。
阶段4:反序列化
(7)客户端基础架构接收返回的SOAP消息,将XML反序列化为返回值和输出参数,并将其传递给代理类的实例。
(8)客户端应用程序接收返回值和输出参数。
5.Web服务适用的场合:
提供不断更新的实时数据供其他应用程序使用。
集成现有的各种应用程序。
提供工作流解决方案。
远程处理(RPC)
RPC(Remote Procedure Call)——远程过程调用。
1)远程处理技术是为了解决不同计算机上的进程相互访问的一种具体实现。
2)NET远程处理模型生成一个应用程序,并让其中两个组件直接跨应用程序域边界进行通信。此时需要生成以下内容:
①一个可远程处理的对象。
②一个宿主应用程序域,用于侦听针对该对象的请求。
③一个客户端应用程序域,用于发出针对该对象的请求。
消息队列(MSMQ)
~~MQ(Message Queue)是在多个不同的应用程序之间实现相互通信的一种基于队列和事务处理的异步传输模式。
1)其实现原理是:消息发送者把要发送的信息放入一个容器中(称为Message),然后把它保存至一个系统公用的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。
2)MQ中的消息和队列。
3)MQ的两种发送方式:快速模式和可恢复模式
4)MSMQ是微软实现的MQ。
面向服务的体系结构(SOA)
SOA(Service-Oriented Architecture,面向服务的体系结构)。
1)其基本思想就是希望用一种统一的、以“服务”为中心的模型来整合各种不同的技术,而不是仅仅限于Web服务。
2)对于.NET开发人员来说,这个基于SOA的具体实现就是WCF。
WCF入门
WCF基础知识
1️⃣WCF是微软公司推出的符合SOA思想的分布式应用程序技术框架和编程模型。
2️⃣WCF编程模型的目标是实现以下两个实体之间的通信:WCF服务和WCF客户端。
3️⃣该编程模型封装在.NET框架的System.ServiceModel命名空间中。
1.WCF特点:
以服务为中心
支持多种消息交换模式
支持多种传输协议和编码方式
支持工作流、事务以及持久性的消息处理
统一性、安全性和可扩展性
2、终结点(EndPoint)
1)终结点(EndPoint)用于确定网络通信目标,用EndPoint类来实现,在配置文件中用配置节来指定。
2)对于WCF来说,终结点由地址、协定和绑定组成,三者缺一不可。其中,地址(Address)用于公开服务的位置,协定(Contract)用于公开提供的是哪种具体服务。
例如:
(1)地址(Address)
①WCF中的地址用于确定终结点的位置。地址可以是URL、FTP、网络路径或本地路径。WCF规定的地址格式为:
[传输协议] : / / [位置][:端口][/服务路径]
例如:
http://www.mytest.com:50001/MyService
http://localhost:8733/Design_Time_Addresses/MyService
http://localhost:8080/MyService
②WCF服务可以在各种不同的基础网络协议(例如TCP、UDP、HTTP等)之间传输。
下面的代码演示了客户端通过TCP访问WCF服务的地址格式:
net.tcp://localhost:50001/MyService
(2)绑定(Binding)
①WCF通过绑定来定义WCF客户端与WCF服务通信的方式。
WCF提供了多种绑定方式(BasicHttpBinding、WSHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetMsmqBinding)。
②不论是服务端还是客户端,一般都是在单独的配置文件(Web.config、App.config)中配置绑定。
(3)协定(Contract)
①协定表示客户端和服务端之间的信息交换规则。如果不指定协定,就无法在客户端和服务端之间进行通信。
例如:服务协定、数据协定、消息协定等。
②协定在接口中用Contract特性来声明,内部用ContractAttribute类来实现,在配置文件中用contract指定。
服务端和客户端
假设有A、B、C、D四台计算机,A、B、C三台计算机安装的操作系统都是Windows 7,D计算机安装的操作系统为Windows Sever 2008 R2。这四台计算机上分别部署以下应用程序,构成一个简单的分布式应用系统。
一个名为WcfA的WCF服务库,同时部署到A、B两台计算机上,该服务库通过Windows服务让其开机自启动WCF服务。
一个名为WcfB的WCF服务应用程序,通过IIS部署到D计算机上,该计算机是一台Web服务器,也是开机自启动WCF服务。
一个名为WpfApp的WPF应用程序,这是一个客户端应用程序,用户可通过Web服务器提供的下载链接网页,分别下载并安装到A、B、C三台计算机上。
下面通过例子说明服务端、客户端和终结点之间的区别和联系
(a)当WcfA中的某个方法调用WcfB中的某个方法时,此时A是客户端,D提供WCF服务;反之,当WcfB中的某个方法调用WcfA中的某个方法时,此时D是客户端,A提供WCF服务。
(b)当A、B、C上的WpfApp调用WcfA中的某个方法时,A、B、C都是客户端,A提供WCF服务。
(c)A、B、C、D都是终结点。准确来说,是WcfA、WcfB这些进程(或线程)执行的方法、通信对应的IP地址、端口以及相关的协定共同构成终结点。
WCF体系结构
协定层
协定层用于在相互传递消息之前制定服务规则、数据交换规则、消息格式、安全策略、绑定的网络协议,以及消息采用的数据编码方式等
服务运行时层
处理在服务实际运行期间发生的行为
消息传递层
消息传递层描述数据的各种格式和交换模式
激活和承载层
负责激活或者承载WCF服务
承载WCF的方式
WCF本身不能运行,只能将其“宿主”在某个可执行程序中(.dll或者.exe)才能运行。
承载WCF的方式有三种:
1.利用IIS或者WAS承载WCF服务
最常用的承载方式
2.利用Windows服务承载WCF服务
利用Windows服务进程激活的方式
3.自承载方式
比较灵活的承载方式
1、利用IIS或者WAS承载WCF服务
1)IIS和IIS Express
①IIS是微软推出的Web应用服务器。
②WCF应用程序开发完成后,将其部署在服务器操作系统(例如Windows Server 2008、Windows Server 2012)的IIS中即可。
2)WAS(Windows Process Activation Service,Windows进程激活服务)
①利用WAS,不需要将程序部署到IIS中,就可以承载并自动激活WCF服务,而且不需要开发人员编写任何承载代码。
3)【WCF服务应用程序】采用这种模式
2、利用Windows服务承载WCF服务
1)Windows服务是Windows操作系统提供的功能,操作系统利用进程控制块来管理它。
①Windows服务一般都是开机自启动的。
2)编写WCF服务程序时,可以利用【WCF服务库】模板将WCF服务制作成单独的DLL文件,调试程序时系统会自动将其宿主到WCF服务主机中来承载WCF服务,并利用Windows进程去自动激活它。
3、自承载方式
1)自承载WCF是指开发人员自己编写代码实现承载WCF的工作。
①本质是利用Windows进程激活服务来承载WCF的,但不是直接用WCF模板来实现承载工作,而是利用.NET框架公开的相关类去实现承载WCF的工作。
2)自承载的优点
①实现灵活。开发人员可在程序中随时启动、关闭和通过代码配置WCF服务,或者通过程序提供的界面,让用户根据需要随时启动和停止服务。
②可以通过代码选择多种基础传输协议(例如HTTP、TCP、UDP等),也可以通过代码来配置服务。
③部署自承载程序时,需要的环境支持要求最小。
自承载的缺点
①所有承载的实现代码都需要程序员自己去编写。
②该方案不是面向服务的企业级分布式解决方案。
WCF服务端和客户端编程基础
WCF服务器端编程模型
WCF服务应用程序
①该模板利用IIS自带的WAS承载和激活WCF服务
②系统会自动运行WCF测试客户端(WcfTestClient.exe)
③同一个解决方案中既包括WCF服务应用程序项目又包括WCF客户端项目时,运行客户端程序时,该模板会利用WAS自动承载并激活WCF服务。
WCF服务库
①该模板是利用WCF服务(WcfSvcHost.exe)承载并激活WCF服务。
②系统会自动运行WCF测试客户端(WcfTestClient.exe)
③仅适用于需要长时间(开机运行)WCF服务的场合
其他模板
①【WCF工作流服务】模板、【WCF联合服务库】模板
编写WCF服务端程序有4个主要步骤:选择承载方式、设计和实现协定、配置服务、承载服务。
1、选择承载方式
1)编写HTTP应用程序时,一般选择【WCF服务应用程序】模板。
2)编写TCP应用程序时,既可以选择自承载方式,也可以选择【WCF服务应用程序】模板。
3)编写UDP应用程序时,既可以用自承载方式,也可以用标准绑定。
2、设计和实现协定的方式
方式1:用一个接口公开多个方法,再用一个类实现接口中声明的所有方法。(建议)
可以实现多继承。
代码改动量小。
版本升级简单。
方式2:全部用类来实现,不使用接口。
优点:简单、直观
缺点:多继承无法实现、版本升级困难。
3、配置服务
方式1:通过修改配置文件(Web.config或者App.config)(建议的方式)
优点:部署服务端应用程序时,不需要修改源程序,只需要修改配置文件即可。
方式2:开发人员自己编写代码
4、承载服务
服务端设计完成后,运行(承载)服务即可,此时客户端就可以和服务端交互。
WCF客户端编程模型
编写WCF客户端应用程序时,可使用多种应用程序编程模型。
WPF应用程序
适用于开发实际的基于C/S模式的WCF客户端应用程序的场合。
控制台应用程序
在实际应用中,一般不会用它来实现。
其他应用程序
WinForm应用程序
Windows应用商店应用程序(仅适用于Windows 8操作系统)
ASP.NET
Silverlight
编写WCF客户端程序的主要步骤如下:
1、利用服务端配置生成客户端代理类和客户端配置
运行WCF服务后,客户端可通过【添加服务引用】的办法,让系统自动生成客户端代理类,此时它会根据服务端配置(Web.config或者App.config)自动修改客户端配置(App.config)
2、编写客户端代码
客户端添加服务引用后,即可利用自动生成的客户端代理类,编写代码与WCF交互。
3、更新客户端配置
如果服务端配置文件(Web.config或者App.config)发生了改变,或者接口发生了改变,此时需要在客户端更新服务引用,以便让系统重新生成新的客户端配置(App.config)
编写服务端和客户端程序的基本思路
编写WCF程序的基本步骤如下:
创建服务端项目和客户端项目
编写服务端代码
修改服务端配置
测试服务(可选)
在客户端添加服务引用
编写客户端调用代码
更新服务引用(可选)
编写WCF程序的基本步骤如下:
1、在同一个解决方案中创建客户端项目和服务器端项目
(1)客户端选用WPF模板
(2)服务器端选用WCF服务应用程序模板
IService1.cs:用接口定义服务协定和数据协定。
Service1.svc和Service1.svc.cs:实现IService1接口中声明的服务操作。
Web.config:服务端配置文件,用于定义服务行为以及绑定的协议等。
(3)添加新服务
编写WCF程序的基本步骤如下:
2、编写服务器端代码
(1)定义接口
[ServiceContract]
public interface IService1
{
[OperationContract]
string SayHello(string name);
[OperationContract]
double Add(double d1, double d2);
[OperationContract]
double Divide(double d1, double d2);
}
2)实现接口
public class Service1 : IService1
{
public string SayHello(string name)
{ return string.Format(“Hello, {0}”, name); }
public double Add(double d1, double d2)
{ return d1 + d2; }
public double Divide(double d1, double d2)
{ return d1 / d2; }
}
3)重新生成
代码编写完毕后,鼠标右键单击WcfService项目名,
选择【生成】或者【重新生成】命令,确保没有语法错误。
3.修改服务器端配置
1)修改绑定配置
2)开通调试功能
在Web.config中找到includeExceptionDetailInFaults,将其改为true。
4、测试服务(可选)
5、在客户端添加服务引用
让其自动生成WCF客户端代理类,以及让其自动更新客户端配置文件(App.config)。 添加服务引用的步骤。
**(1)**确保服务已经启动 鼠标右键单击WcfService项目,选择【生成】或者【重新生成】命令。此步骤是为了确保系统能自动运行成功生成的WCF服务。如果WCF服务没有启动,添加服务引用会失败。
**(2)**查找引用的服务 鼠标右键单击Client项目中的【引用】→【添加服务引用】命令,在弹出的对话框中,单击【发现】按钮,此时它会自动找到与该项目在同一个解决方案中的WCF服务。注意地址中的端口号是系统自动生成的。
**(3)**不修改默认生成的命名空间ServiceReference1,单击【确定】按钮,即将服务引用添加到项目中。
添加服务引用后,系统会自动在指定的命名空间中(本例子为 ServiceReference1)生成客户端代理类(Service1Client),以后就可以利用它在客户端应用程序中调用WCF提供的服务了。
6、客户段编码
(1)前端设计(略)
(2)隐藏类编码
using Client.ServiceReference1;
……
{ //创建服务客户端
Service1Client client = new Service1Client();
//调用服务
string s = client.SayHello(“欢迎学习WCF!”);
//关闭服务客户端并清理资源
client.Close();
textBlock1.Text += s; }
设计和实现协定
协定和特性
协定:WCF在互相传递消息之前预先制定的数据交换规则,以便交换数据的双方能彼此理解对方发送的数据及其格式码。
WCF中最常用的协定是服务协定和数据协定,通过特性声明。
特性:用来声明服务端定义的所有协定。
①在C#中,所有特性类都是从Attribute类继承而来的,而且其名称都有Attribute后缀。
②用C#编写代码时,一律用中括号来声明特性类,声明时省略Attribute后缀,这是建议的用法。
③特性类的用途是为紧跟在它后面的目标元素提供设计行为。比如对某个字段声明了某个特性,则该特性的目标元素就是这个字段。
例如:
[ServiceContract]
public interface IService1
{
[OperationContract]
double Add(double n1, double n2);
}
①这段代码对IService1接口用ServiceContract特性声明了服务协定,对Add方法用OperationContract特性声明了操作协定。
②编译器编译这段代码时,遇到ServiceContract特性声明,它就会自动创建ServiceContractAttribute类的一个实例,并通过该实例处理IService1接口。
③实际处理过程是用进程和线程实现的。
服务协定
服务协定:指WCF对客户端公开哪些服务。
WCF服务端通过服务协定向客户端公开以下内容:
①操作方法、
②消息交换模式、
③采用的通信协议以及序列化格式。
服务协定包括ServiceContract特性和OperationContract特性。
①ServiceContract特性用于在应用程序中定义服务协定。
②OperationContract特性用于在应用程序中定义操作协定。
ServiceContract特性常用属性:
#CallbackContract:获取或设置双工通信的回调协定类型,默认为null。
#Name和Namespace:获取或设置Web服务描述语言(WSDL)中元素的名称和命名空间。
#HasProtectionLevel:获取一个bool类型的值,该值指示是否对成员分配了保护级别。如果分配了保护级别(非None)则为true,否则为false。
#ProtectionLevel:设置绑定支持的保护级别,默认值为#ProtectionLevel.None。可选择的值有:EncryptAndSign(对数据进行加密和签名确保所传输数据的保密性和完整性)、None(仅身份验证)、Sign(对数据签名确保所传输数据的完整性)
#SessionMode:获取或设置采用的会话模式。
OperationContract特性常用属性
#IsOneWay:获取或设置是否不应答消息,默认为false(返回应答的消息)。
#IsInitiating:获取或设置一个布尔值,该值指示接口中的方法是否在服务端启动会话时就可以实现操作,默认为true。
基本用法
#在接口的前面用ServiceContract特性声明服务协定,在接口的内部用操作协定公开操作方法;在对应类中实现接口声明的方法:
[ServiceContract(Namespace = “WcfServiceExamples”)]
public interface IService1
{
[OperationContract] double Add(double n1, double n2);
[OperationContract] double Divide(double n1, double n2);
}
public class Service1 : IService1
{
public double Add(double d1, double d2)
{
return d1 + d2;
}
public double Divide(double d1, double d2)
{
return d1 / d2;
}
}
注意:WCF规定实现服务的接口中只能包含方法声明,不允许在接口中声明属性和字段。换言之,属性和字段是在实现接口的类中通过数据协定来公开的。
数据协定
数据协定:数据协定是服务端与客户端之间交换数据的约定,即用某种抽象方式描述要交换的数据并将其传输到客户端。
数据协定默认采用XML格式。
通过数据协定,客户端和服务端不必共享相同的类型,而只需共享相同的数据协定即可。
数据协定利用DataContract特性和DataMember特性声明。
#DataContract特性定义那些类可以被序列化
#DataMember特性用于声明类中的哪些成员可被序列化
[DataContract]
public class MyData1{
[DataMember] public int Age;
}
基本用法
显式声明数据协定和成员协定:对于显式声明DataContract特性和DataMember特性的成员进行序列化。
[DataContract]
public class MyData1
{
//不论是private还是public,只要声明Datamember就可以序列化
public string MyName1 = “me1”; //未声明Datamember,无法序列化
[DataMember] public string MyName2 = “me2”; //可序列化
[DataMember] private string myName3 = “me3”; //可序列化
[DataMember] public int Age { get; set; } //可序列化
[DataMember] public List MyStudents { get; set; } //序列化为数组
private string telephone = “null”; //无法序列化
[DataMember]
public string Telephone //可序列化
{
get { return telephone; }
set { telephone = value; }
}
}
隐式声明数据协定和成员协定: WCF会自动对具有public修饰符的类、结构、枚举等应用数据协定,对具有public修饰符的字段和同时具有get和set的属性应用成员协定。
public class Student
{//同时具有get和set并且声明为public的属性默认都拥有成员协定
public int ID { get; set; }
public string Name { get; set; }
public int Score { get; set; }
public string OtherInfo { get; set; }
public Student()
{
ID = 0;
Name = “张三”;
Score = 50;
OtherInfo = “无其他信息”;
}
public override string ToString()
{
return string.Format(“学号:{0},姓名:{1}, 成绩:{2}, {3}”,ID, Name, Score, OtherInfo);
}
}
注意问题:
属性的限制
#将DataMember特性应用于属性时,该属性必须同时具有get和set
#用隐式声明时,凡是具有public修饰符的字段,都应该用属性来表示。如果直接用public修饰符的字段来表示,必须使用显式声明
构造函数的处理
#不要在客户端直接创建服务端提供的类的实例,而是通过客户端代理类来调用
静态成员的处理
#只能将DataMember特性应用于字段和属性,应用在静态成员上将被忽略。
消息协定
消息协定:在有些情况下,需要用单个类型来表示整个消息。使用消息协定可以避免在XML序列化时产生不必要的包装。
通过MessageContract特性(MessageContractAttribute类)来实现。
MessageHeader特性和MessageBodyMember特性。
#在消息协定的内部,通过MessageHeader特性(MessageHeaderAttribute类)指定消息头,通过MessageBodyMember特性(MessageBodyMemberAttribute类)指定消息体。
#可以对所有字段、属性和事件应用MessageHeader特性和MessageBodyMember特性,而与这些字段、属性和事件的访问修饰符无关,即不论是public、private、protected还是internal,都能使用这两个特性。
#如果类型中既包含消息协定又包含数据协定,则只处理消息协定。
服务绑定与终结点配置
在服务端配置文件中配置WCF服务
1)用【WCF服务应用程序】模板创建WCF服务项目时:
#服务端配置信息保存在项目的Web.config文件中
#客户端应用程序中的配置信息保存在项目的App.config文件中。
2)用自承载WCF创建WCF服务项目时,或者用【WCF服务库】模板创建WCF服务项目时:
#服务端和客户端的配置信息都保存在对应项目的App.config文件中。
3)对于终结点配置来说,通过配置文件(Web.config、App.config)配置终结点是建议的做法。
#Web.config文件的配置结构 见课本 P160。
修改配置的方式
1.直接修改配置
1)修改服务端配置文件最方便的办法是直接打开并修改它
2)Web.config中的服务绑定配置完成后,在客户端添加服务引用时,系统会自动修改App.config文件中对应的客户端绑定配置
2.利用配置工具修改配置
1)在开发过程中,除了直接修改配置文件外,还可以利用配置工具(Svcutil.exe,或者叫ServiceModel元数据实用工具)配置和查看各个参数的具体值
2)【解决方案资源管理器】中右击Web.config文件,选择【编辑WCF配置】命令,此时即可以通过配置窗体查看或修改各个属性的值
终结点绑定方式
1)终结点绑定方式
①在系统提供的绑定中,最基本的就是basicHttpBinding。
②除此之外,系统提供的常用绑定方式还包括:wsHttpBinding、wsDualHttpBinding、netTcpBinding、udpBinding、netNamedPipeBinding、netMsmqBinding以及netPeerTcpBinding。
③选择绑定时需要注意的事项
~必须确保始终选择具有安全性保障的绑定
~basicHttpBinding默认未启用安全性,其他绑定默认都已启用了安全性。如果在实际项目仍然使用basicHttpBinding,注意部署时一定不要忘记启用安全性。
需要绑定的元素及其含义
1)绑定指定终结点之间通话时所使用的通信机制。
2)绑定元素有:协议通道绑定元素、传输通道绑定元素和消息编码绑定元素。
3)WCF提供了两种类型的通道:协议通道和传输通道
协议通道绑定元素(绑定消息处理协议)
①协议通道绑定元素用于确定绑定到哪种消息处理协议(WS-Security或者WS-Reliability)来确保消息的安全性和可靠性。(WS是Web Service的缩写)
②该通道还处理自定义的消息处理协议。
协议通道绑定元素
安全性(security)
1)消息的安全性(security)是指消息的安全处理方式,即如何保护传输通道使其满足安全要求。
2)在下的节中,可使用mode特性配置消息的安全性(security),该特性的可选值包括:
None:指不保护SOAP消息且不验证客户端的身份。
Transport:在传输层上满足安全要求。
Message:在消息层上满足安全要求。
混合(TransportWithMessageCredential或者TransportCredentialOnly):安全性声明包含在消息中,而完整性和保密性要求则由传输层来满足。
例如:
…
<system.serviceModel>
<binding … >
…
</system.serviceModel>
…
可靠性(WS-Reliability)
1)消息的可靠性是指WCF通过传输通道传输消息的过程中,确保消息到达目的地而不会丢失消息,也叫WS-Reliability
事务
1)事务是指某个通信过程要么全部完成,要么回滚到未通信前的初始状态,但绝不会出现半途而废的情况。
双工(Duplex)
1)指定是否支持双工通信。
传输方式(TransferMode)
1)传输方式指传入和传出消息时使用的数据流采用哪种机制。
①流式:如果直接发送消息时,则称为流式的;
②缓冲式:如果是先保存到某个缓冲区中,等缓冲区满时再发送,则称为缓冲式的。
2)使用TransferMode可设置传输方式。
Buffered(请求消息和响应消息都是缓冲式的)、
Streamed(请求消息和响应消息都是流式的)、
StreamedRequest(请求消息是流式的,而响应消息是缓冲式的)
StreamedResponse(请求消息是缓冲式的,而响应消息是流式的)。
传输通道绑定元素(绑定基础传输协议)
传输通道绑定元素指定终结点发送消息时使用的基础传输协议。
1)使用基础传输协议来传输消息,例如HTTP、TCP、UDP等。
2)负责对消息进行编码和解码。
消息编码绑定元素
1)消息编码绑定元素指定对发送到终结点的消息使用的消息编码。
2)消息编码方式可以是:
Text:采用哪种文本编码方式。比如unicode、utf-8
Binary:二进制格式。
MTOM:消息传输优化机制。这是一种对SOAP信封上下文中二进制XML元素高效编码方法。
关于大型数据的特殊安全考虑事项
WCF的所有绑定都允许限制传入消息的大小,以拒绝服务攻击。
例如,BasicHttpBinding会公开一个MaxReceivedMessageSize属性,该属性限制传入消息的大小(默认值为65536个字节),同时还限制在处理该消息时访问的最大内存量。
开发和部署时的配置区别
1)在程序的开发阶段,设置服务端配置文件中的终结点绑定后,就可以在客户端通过【添加服务引用】或者【更新服务引用】命令,让其自动添加或更新客户端App.config中相应的终结点配置。
2)部署应用程序时,可以通过手工修改或者通过专门的应用程序配置界面,分别修改服务端配置和客户端配置。