[Solution] 一步一步WCF(2) 终结点Endpoint
繁忙的一天又一天,不管其他,先继续WCF吧。
Endpoint包含地址,绑定,契约三要素。WCF作为一个Windows平台下最大的通信框架。通过终结点承载了所有通信功能。所以终结点的作用将非常重要。
本节,将介绍
- SOA
- Address
- Bingding
- Contract
- Behavior
面向服务架构(Service-Oriented Architecture)代表的是一种对关注点分离的思想,对于不同的人来说具有不同的意思。
而WebService、WCF以及其他平台的Web服务则是实现SOA思想的技术手段。
SOA还是有一些基本特性是被大家共同认可的。
设计原则 | 描述 |
服务契约 | 通过契约文档,服务描述功能和目的 |
松耦合 | 依赖关系最小化 |
抽象 | 服务隐藏具体实现,只发布契约文件 |
重用 | 一种服务可以被其他服务重用 |
自治 | 服务是独立的 |
可发现 | 通过服务元数据,可以来找到服务和调用服务 |
组合 | 一种服务可以由其他服务组合而成 |
而WCF就是一个完全基于SOA的通信框架,WCF将目前微软所有的分布式技术统一。如.Net Remoting WebService MSMQ。
Address指的是System.ServiceModel.EndpointAddress。
有如下属性:
最核心的就是URI。它可以作为Endpoint唯一标识。
URI的结构为:scheme://ip:point/path 如:http://127.0.0.1:10000/a/b.svc
常见的scheme有:
http/https:无状态,http默认端口80,https默认端口443
net.tcp:稳定 支持双工通信。默认端口808.
net.pipe:同一台机器,不同进程间通信。虽然命名管道本身可以实现跨平台,但在WCF中只用于同一台机器,所以ip只能为本机。
net.msmq:消息队列方式。
基地址:
除了以上通过绝对地址的方式,还可以通过“基地址+相对地址”的方式进行设置。
如何设置基地址:
class Program { static void Main(string[] args) { var uris = new []{new Uri("http://localhost:10000/"),new Uri("net.tcp://localhost:10001/")}; using (ServiceHost host = new ServiceHost(typeof(SomeService),uris) { host.AddServiceEndpoint(typeof(ISomeService),new BasicHttpBinding(),"SomeName"); host.open(); Console.Read(); } } }
uris定义的就是基地址,SomeName就是相对地址的名称。通过访问uris的任意基地址+SomeName,即可访问服务。如:http://localhost:10000/SomeName
注意:一个传输协议只能有一个基地址。
<system.serviceModel> <services> <service name="SomeService"> <endpoint address="SomeName" binding="basicHttpBinding" contract="ISomeService"></endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:10000/"/> <add baseAddress="net.tcp://localhost:10001/"/> </baseAddresses> </host> </service> </services> </system.serviceModel>
Address除了Uri这个重要的属性外,还有Identity(身份信息),Headers(在传输中附带其他信息)
端口共享:
需求:
为了尽可能避免网络攻击,一般暴露出来的端口只有几个。这时,端口共享的意义非常大。
问题:
而一般,一个端口只能被一个进程独占。
实现:
http/https:通过IIS虚拟路径的形式。
net.tcp:启动共享服务,设置属性。
启动该服务
设置属性
var bind = new NetTcpBinding(); bind.PortSharingEnabled = true;
对于1个SOA的系统而言,系统之间的交互是通过Message的形式。Address用来解决寻址。Binding用来解释系统之间交互的所有底层细节。
最主要的是Transport(传输协议)和Encode(消息编码)。
下边这个表格列出了Binding中的各个层次结构。
Layer |
Options |
Required |
Transactions |
TransactionFlowBindingElement |
No |
Reliability |
ReliableSessionBindingElement |
No |
Security |
SecurityBindingElement |
No |
Encoding |
Text, Binary, MTOM, Custom |
Yes |
Transport |
TCP, Named Pipes, HTTP, HTTPS, MSMQ, Custom |
Yes
|
Contract的主要作用是暴露某个WCF Service所提供的所有有效的Functionality。所以Contract解决的是What functionalities do the Service provide?
值得注意的是,Contract接口,凡是与WCF挂钩的都需要打上WCF的服务标记。(ServiceContract,OperationContract等特性)
如:
[ServiceContract] interface ICar { [OperationContract] void Run(); }
Behavior
Behavior也是Endpoint的一个属性。它的主要作用是用于定义Endpoint的一些必要的行为信息,包括元数据的发布。(目前只知道元数据的发布用了?)
本文作者:Never、C
本文链接:http://www.cnblogs.com/neverc/p/4693344.html