WCF 学习简单总结
定义:面向服务的分布式编程框架。统一COM和.Net Remoting提供通用,可靠的分布式编程模型。
具有ABC这三个特性。
A->Address 地址
地址包含服务位置和传输协议(传输样式)这两个元素。
- 基于http协议
- 基于tcp协议
- 基于进程间通信
- 基于消息队列通信
当然还有包括https和服务总线的协议模型。
B->Binding 绑定
绑定定义了服务间通信的基本方式。常用绑定如下:
- 基本绑定
- Web服务绑定提供基于internet的通信。
- TCP绑定使用TCP协议实现了跨机器的通信。
- IPC绑定使用命名管道在进程间通信。
- MSMQ绑定使用消息队列通信
C->Contract 契约
契约是描述服务功能的标准方式。
- 服务契约 描述可用服务操作
- 数据契约 定义与交互的数据类型
- 错误契约 定义抛出的错误操作
- 消息契约 允许服务于消息交互
EndPoint 终结点
终结点组装ABC暴露给调用服务的客户端。
终结点的可以通过配置和编码。
WCF服务必须托管的宿主进程中,自托管,IIS发布。
Mex 元数据:WCF服务元数据是ABC的原始描述信息。
元数据基于XML,自描述。客户端根据元数据反序列化生成本地代码。
优势:
1,统一性
由多种技术的整合,仍然是面向对象代码编写,采用托管代码编写方式。
2,互操作性
它采用SOAP通讯机制,保证了系统之间的互操作性,可以跨进程、跨机制。甚至跨平台通信,只要他支持web Service。
3,安全与可靠性
因为它包含多种协议,故有多种协议的安全机制,尤其是SOAP的。
4,兼容性
它可以在新旧平台上使用。
缺点
1 需要更多底层资源
简单使用:
服务端
- ServiceContract提供服务
- OperationContract 提供操作
- DataContract提供数据
客户端调用:
- 使用vs添加服务引用
- ServiceHost创建宿主
- 加载元数据结点 ServiceMetadataBehavior
- 加载结点NetTcpBinding,selfHost.AddServiceEndpoint
题目
WCF和ASMX WebService的区别是什么?
都基于HTTP的SOAP通讯。但WCF能使用任意协议和格式(默认SOAP)。
怎么理解WCF的Service EndPoints?
Address:标识了服务地址和协议;
Binding:通信方式
Contract:描述的服务功能,
4. 怎样在WCF Service中启用操作重载(Operation Overloading )?
重载通过OperationContract的Name属性实现
private void StartAPPWCFService()
{
string serviceAddress = string.Format("net.tcp://{0}:{1}/", "localhost", CommonData.Configuration.Port);
Dictionary<Type, Type> sevtypes = new Dictionary<Type, Type>();
sevtypes.Add(typeof(IPersonService), typeof(PersonService));
sevtypes.Add(typeof(ISafetyService), typeof(SafetyService));
sevtypes.Add(typeof(IPressureService), typeof(PressureService));
string endpointAddress = string.Empty;
string tName = string.Empty;
foreach (var item in sevtypes)
{
tName = item.Value.Name;
endpointAddress = serviceAddress + tName;
ServiceHost serviceHost = new ServiceHost(item.Value, new Uri(endpointAddress));
//加载元数据结点
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
serviceHost.Description.Behaviors.Add(smb);
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
//加载NetTcpBinding结点
NetTcpBinding netTcpBinding = SetTCPBinding();
serviceHost.AddServiceEndpoint(item.Key, netTcpBinding, endpointAddress);
serviceHost.Open();
listServiceHost.Add(serviceHost);
}
}
服务器端
WCF系列 基础概念:https://www.cnblogs.com/qyzBlog/p/4205574.html
面试题:http://www.cnblogs.com/superstar/archive/2013/01/17/2864629.html