WCF4.0新特性体验(3):标准终结点(Standard Endpoints)

本文来自博客园网站 作者:Frank Xu Lei

  今天在WCF4.0新特性体验第3节,我们介绍WCF4.0里的标准终结点概念,也就是Standard Endpoints。

  WCF4.0提供了那些标准终结点?他们有什么作用?如何使用标准终结点?如何该表标准终结点的属性?如何自定义一个标注终结点?本文会给出介绍。

  WCF4.0提供了8个已经定义好的标准终结点。下面我们会给出详细介绍,然后是简单的示例代码。标准终结点并不是标准化终结点或者给终结点提供什么参考标准。这个标准终结点其实就是预定义好的终结点,WCF4.0已经内置到Framework里,我们可以直接使用。说白了,就是已经成型,可以直接使用。使用这些定义好的终结点,无非就是可以简化我们的开发工作。

【1】标准终结点介绍:

  WCF4.0提供了8个已经定义好的标准终结点,它们是:mexEndpoint、announcementEndpoint、

discoveryEndpoint、udpAnnouncementEndpoint、udpDiscoveryEndpoint、workflowControlEndpoint、webHttpEndpoint、webScriptEndpoint。这些终结点其实与WCF4.0的新增特性密切相关。从名字我们基本可以看出其作用。其中与WS-Discovery服务动态发现相关的最多。包含4个:announcementEndpoint、 discoveryEndpoint、udpAnnouncementEndpoint、udpDiscoveryEndpoint。各个终结点的作用如下表:

WCF4.0里的标准终结点

名称 描述
mexEndpoint 预定义了一个元数据交换节点,默认使用IMetadataExchange 契约和mexHttpBinding 绑定,address为空。
announcementEndpoint 为discovery的声明功能预定义的标准终结点,在使用此终结点用户需要额外配置address和binding。
discoveryEndpoint 为discovery 操作,预定义的一个标准终结点,在使用此终结点用户需要额外配置address和binding。
udpAnnouncementEndpoint 为使用UDP binding和WS-Discovery 协议规定的多播地址的discovery的声明功能提供的预定义的终结点。它继承自announcementEndpoint。
udpDiscoveryEndpoint 为discovery 操作提供的预定义的终结点。比如通过UDP binding和WS-Discovery 协议规定的多播地址的发现(find) 和解析(resolve。它继承自DiscoveryEndpoint。
workflowControlEndpoint 定义了一个控制workflow 实例执行状态的标准终结点(create、run、suspend、terminate等等)。
webHttpEndpoint 定义了一个配置了WebHttpBinding 和WebHttpBehavior的标准终结点。它继承自WebServiceEndpoint。在编写REST service使用。
webScriptEndpoint 定义了一个配置了WebHttpBinding 和WebScriptEnablingBehavior的标准终结点。它用于编写ASP.NET AJAX程序。

  这里EndPoint提供了2个新的属性:Kind和IsSystemEndpoint.

Kind:这里设定终结点的类别,一般是标准终结点的种类,或者用户自定义的标准终结点。如果不指定,则认为是一般的终结点。

IsSystemEndpoint:Boolean变量,设定终结点是否为系统终结点。

  你可以在服务终结点里直接使用这些标准终结点。使用的方式就是在EndPoint的Kind属性里定制特定的标准终结点的类型。这些标准终结点默认使用缺省属性,当然你也可以在standardEndpoints重新定制这些属性。

【2】代码示例:

  下面我们来演示一下如何使用standardEndpoints。这里主要是通过配置文件方式使用标准终结点。

  (1)标准终结点:我们配置了4个服务终结点,其中3个使用了标准终结点。第一个服务终结点我们Kind不做设置,这个终结点就是普通的服务中介店。具体配置信息如下:

<services>
    <service name="WCFService.WCFService">
      <endpoint  name="endpoint1"
          address="https://localhost:8000/WCFService" 
          binding="wsHttpBinding" 
          contract="WCFService.IWCFService">
        </endpoint>
      <endpoint name="endpoint2" kind="webHttpEndpoint"  contract="WCFService.IWCFService">
      </endpoint>
      <endpoint name="endpoint3" kind="udpDiscoveryEndpoint"   endpointConfiguration="udp">
      </endpoint>
      <endpoint name="endpoint4" kind="mexEndpoint"   address="mex"></endpoint>
      <host>
        <baseAddresses>
          <add baseAddress="https://localhost:8000/"/>
        </baseAddresses>
      </host>
    </service>
  </services>

  (2)运行结果:

  配置完毕4个终结点以后,我们可以启动宿主查看终结点信息。终结点2、3、4标准终结点,分别引用webHttpEndpoint、udpDiscoveryEndpoint和mexEndpoint。运行结果如下图:

  (3)覆盖属性:

  如果我们感觉这些标准终结点的功能不符合要求,我们也可以通过standardEndpoints重新定制这些默认终结点的属性信息。配置代码如下:

  <standardEndpoints>
    <udpDiscoveryEndpoint>
      <standardEndpoint name="udp" maxResponseDelay="00:01:00"  discoveryMode="Adhoc" discoveryVersion="WSDiscovery11"/>
    </udpDiscoveryEndpoint>
  </standardEndpoints>

  这里你只需要把name应用到特定的标准终结点上即可。使用终结点配置属性,例如:endpointConfiguration="udp"。

  (4)自定义标准终结点:

  英文原文是custom standard endpoint 。我们可以定制自己的标准终结点,以便其他地方使用。这里我们需要使用extensions节点,在配置文件里指定新的标准终结点的name和type。name比如能与WCF4.0提供的标准终结点重复,而type为:namesapce,class。示例配置:

    <extensions>
      <endpointExtensions>
        <add name="customStandEndpoint" type="WCFService.IWCFService, WCFService" />
      </endpointExtensions>
    </extensions>

  然后在服务终结点里使用:

      <endpoint  name="endpoint6"  kind="customStandEndpoint"
          address="https://localhost:8000/WCFService" 
          binding="wsHttpBinding" 
          contract="WCFService.IWCFService">
        </endpoint>

【3】总结:

  以上就是WCF4.0里标准终结点(standard endpoint)的介绍。目前版本,WCF4.0提供了8个已经定义好的标准终结点,它们是:mexEndpoint、announcementEndpoint、 discoveryEndpoint、udpAnnouncementEndpoint、udpDiscoveryEndpoint、workflowControlEndpoint、webHttpEndpoint、webScriptEndpoint。

  (1)这些预定义的标准终结点可以方便我们的开发工作。当然也提供了属性定制功能,让我们可以根据自己的需要定制特性。  

  (2)不过要想利用这些标准终结点,目前还只能参考英文文档,不过英文资料也很少。(学习的时间可能需要很久。可能还不如自己配置一个终结点来的方便。)

  (3)最终的标准终结点的数量或者特定参考最后的发布文档。这里还是基于Beta2。

  最后给出本文的参考代码,共大家参考学习:http://files.cnblogs.com/frank_xl/3.StandardEndpoints.zip

参考资料:

1.https://msdn.microsoft.com/en-us/library/system.servicemodel.discovery.discoveryendpoint(VS.100).aspx

2.https://msdn.microsoft.com/en-us/library/system.servicemodel.description.webscriptendpoint(VS.100).aspx

3.https://msdn.microsoft.com/en-us/library/system.servicemodel.description.webhttpendpoint(VS.100).aspx

4.https://msdn.microsoft.com/en-us/library/ee620807(VS.100).aspx