[Solution] 一步一步WCF(2) 终结点Endpoint

  繁忙的一天又一天,不管其他,先继续WCF吧。

  Endpoint包含地址,绑定,契约三要素。WCF作为一个Windows平台下最大的通信框架。通过终结点承载了所有通信功能。所以终结点的作用将非常重要。

  本节,将介绍

  • SOA
  • Address
  • Bingding
  • Contract
  • Behavior

 

SOA

面向服务架构(Service-Oriented Architecture)代表的是一种对关注点分离的思想,对于不同的人来说具有不同的意思。

而WebService、WCF以及其他平台的Web服务则是实现SOA思想的技术手段。

SOA还是有一些基本特性是被大家共同认可的。

设计原则 描述
服务契约 通过契约文档,服务描述功能和目的
松耦合 依赖关系最小化
抽象 服务隐藏具体实现,只发布契约文件
重用 一种服务可以被其他服务重用
自治 服务是独立的
可发现 通过服务元数据,可以来找到服务和调用服务
组合 一种服务可以由其他服务组合而成

 

而WCF就是一个完全基于SOA的通信框架,WCF将目前微软所有的分布式技术统一。如.Net Remoting WebService MSMQ。

 

Address

  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;

 

 

Binding

对于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

  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

posted @ 2015-08-07 16:39  Never、C  阅读(1320)  评论(0编辑  收藏  举报