WCF服务编程(3)——以管理的方式配置终结点

一、引言

终结点(endpoint)简单来理解,就是WCF对外提供服务的接口,它包括三个要素:地址(address)、绑定(binding)和契约(contract)。服务端通过终结点对外暴露服务,客户端通过终结点查找服务端的服务。在实际编程中,客户端和服务端都要配置终结点,而且两者要保持一致才能进行通信。这点,我们可以把使用客户端在调用服务端的服务想象成,向10086总台打电话,地址就是我们要播的电话号码,绑定是我们使用的语言(中文、英文等),契约就是我们可以办理的业务,查个话费啊、充个流量啊。

二、终结点的配置

   我们可以在app.config或者web.config中配置终结点,如下,是一个终结点配置的例子:

<services>         
   <service name="WindowsFormsApplication6.Service1">
            <endpoint address="" binding="wsHttpBinding" contract="WindowsFormsApplication6.IService1">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8002/Service1/" />
              </baseAddresses>
            </host>
   </service>
 </services>


Binding设置为wsHttpBinding,表明是http协议的通信方式,关于其他绑定类型,这里不再赘述;contract是我们定义的服务契约,这里要的是带命名空间的全名称形式;address配置为空,表明该服务地址使用baseAddresses标签给出的基地址。这里面的address共有三种配置方案:

第一种,配置空,表明服务地址为配置的基地址。

第二种,配置某个相对路径字符串,比如如下配置:

 <endpoint address="subService" binding="wsHttpBinding" contract="WindowsFormsApplication6.IService1">

在客户端配置中配置的终结点地址将会是带上相对路径的uri:

http://localhost:8002/Service1/subService

第三种:配置全路径uri,此时服务的路劲将会是全新的这个uri,不再使用基地址。如下我们在服务端这么进行配置的话:

<endpoint address="http://localhost:8001/" binding="wsHttpBinding" contract="WindowsFormsApplication6.IService1">

在客户端,配置的终结点路径将是:

http://localhost:8001/

下面是这对最后一种配置客户端配置文件的实例:

<services>
  <service name="WindowsFormsApplication6.Service1">
     <endpoint address="http://localhost:8001/" binding="wsHttpBinding" contract="WindowsFormsApplication6.IService1">
       <identity>
          <dns value="localhost" />
       </identity>
     </endpoint>

     <host>
       <baseAddresses>
          <add baseAddress="http://localhost:8002/Service1/" />
       </baseAddresses>
     </host>
  </service>
</services>


 

有一点要特别注意,起初我针对服务端配置的终结点的理解是,不管哪种方式配置的address,都是一个正常的可访问的uri。但是用vs自带的WCF测试客户端连接时,发现这些终结点配置的uri都不能访问,只能用基地址访问,后面一直纠结于哪里配错误了,直到自己编写了一个客户端引用服务后,自动在客户端的app.config生成了服务度终结点的信息,包括address。所以我猜想这些终结点配置的uri是专门给客户端配置用的,不能像基地址一样访问,谨此记录。

三、为相同服务配置多个终结点

在同一个服务中,我们可以配置不同的终结点,比如下面的配置:

<services>
  <service name="WindowsFormsApplication6.Service1">
     <endpoint address="http://localhost:8001/" binding="wsHttpBinding" contract="WindowsFormsApplication6.IService1">
              <identity>
                <dns value="localhost" />
              </identity>
      </endpoint>
     <endpoint address="subservice" binding="wsHttpBinding" contract="WindowsFormsApplication6.IService1">
              <identity>
                <dns value="localhost" />
              </identity>
     </endpoint>
     <host>
       <baseAddresses>
          <add baseAddress="http://localhost:8002/Service1/" />
       </baseAddresses>
     </host>
  </service>
</services>


我分别配置了两个wsHttpBinding类型的终结点,地址分别是:

http://localhost:8001/

http://localhost:8002/Service1/subservice

此时如果我们再次在客户端引入该服务引用,发现生成的配置文件中也包含这两个终结点:

 

<client>
   <endpoint address="http://localhost:8001/" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
                name="WSHttpBinding_IService1">
                <identity>
                    <dns value="localhost" />
                </identity>
  </endpoint>
  <endpoint address="http://localhost:8002/Service1/subservice"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
                contract="ServiceReference1.IService1" name="WSHttpBinding_IService11">
                <identity>
                    <dns value="localhost" />
                </identity>
  </endpoint>
</client>


我们运行客户端程序,发现程序异常。我们在客户端引用时不能同时创建两个终结点,否则客户端不知道去调用哪个位置的服务,删除一个后运行正常。

 

 

 

 

 


评论