共用方式為


標準端點

端點會由位址、繫結和合約指定。 其他可能會在端點上設定的參數包括行為組態、標頭和接聽 URI。 某些端點類型的這些值不會改變。 例如,中繼資料交換端點一律會使用 IMetadataExchange 合約。 其他端點,例如 WebHttpEndpoint,則一律會要求指定的端點行為。 您可以讓端點針對常用的端點屬性使用預設值,以藉此提升端點的可用性。 標準端點可讓開發人員定義具有預設值的端點,或定義一個或多個端點屬性未改變的位置。 這些端點可讓您不需指定靜態性質的資訊即可使用端點。 標準端點可用於基礎結構和應用程式端點。

基礎結構端點

服務可能會使用某些不是由服務作者明確實作的屬性公開端點。 例如,中繼資料交換端點會公開 IMetadataExchange 合約,但是身為服務作者的您並未實作該介面,而是由 WCF 所實作。 此類型的基礎結構端點擁有一個或多個端點屬性的預設值,其中的某些基礎結構可能不可改變。 中繼資料交換端點的 Contract 屬性必須為 IMetadataExchange,而其他屬性 (例如繫結) 可由開發人員提供。 將 IsSystemEndpoint 屬性設定為 true 即可識別基礎結構端點。

應用程式端點

應用程式開發人員可定義其擁有的標準端點,這些端點可指定位址、繫結或合約的預設值。 您可以從 ServiceEndpoint 衍生類別並設定正確的端點屬性以定義標準端點。 您可以提供可變更屬性的預設值。 其他屬性會有無法變更的靜態值。 下列範例示範如何實作標準端點。

public class CustomEndpoint : ServiceEndpoint
    {
        public CustomEndpoint()
            : this(string.Empty)
        {
        }

        public CustomEndpoint(string address)
            : this(address, ContractDescription.GetContract(typeof(ICalculator)))
        {
        }

        // Create the custom endpoint with a fixed binding
        public CustomEndpoint(string address, ContractDescription contract)
            : base(contract)
        {
            this.Binding = new BasicHttpBinding();
            this.IsSystemEndpoint = false;
        }

        // Definition of the additional property of this endpoint
        public bool Property
        {
            get;
            set;
        }
    }

若要在組態檔中使用使用者定義的自訂端點,您必須自 StandardEndpointElement 衍生類別、自 StandardEndpointCollectionElement 衍生類別,然後在 app.config 或 machine.config 中的延伸區段註冊新的標準端點。 StandardEndpointElement 會針對標準端點提供組態支援,如下列範例所示。

public class CustomEndpointElement : StandardEndpointElement
    {
        // Definition of the additional property for the standard endpoint element
        public bool Property
        {
            get { return (bool)base["property"]; }
            set { base["property"] = value; }
        }

        // The additional property needs to be added to the properties of the standard endpoint element
        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                ConfigurationPropertyCollection properties = base.Properties;
                properties.Add(new ConfigurationProperty("property", typeof(bool), false, ConfigurationPropertyOptions.None));
                return properties;
            }
        }

        // Return the type of this standard endpoint
        protected override Type EndpointType
        {
            get { return typeof(CustomEndpoint); }
        }

        // Create the custom service endpoint
        protected override ServiceEndpoint CreateServiceEndpoint(ContractDescription contract)
        {
            return new CustomEndpoint();
        }

        // Read the value given to the property in config and save it
        protected override void OnApplyConfiguration(ServiceEndpoint endpoint, ServiceEndpointElement serviceEndpointElement)
        {
            CustomEndpoint customEndpoint = (CustomEndpoint)endpoint;
            customEndpoint.Property = this.Property;
        }

        // Read the value given to the property in config and save it
        protected override void OnApplyConfiguration(ServiceEndpoint endpoint, ChannelEndpointElement channelEndpointElement)
        {
            CustomEndpoint customEndpoint = (CustomEndpoint)endpoint;
            customEndpoint.Property = this.Property;
        }

        // No validation in this sample
        protected override void OnInitializeAndValidate(ServiceEndpointElement serviceEndpointElement)
        {
        }

        // No validation in this sample
        protected override void OnInitializeAndValidate(ChannelEndpointElement channelEndpointElement)
        {
        }
    }

StandardEndpointCollectionElement 會針對出現在標準端點組態中,<standardEndpoints> 區段下的集合提供支援類型。 下列範例示範如何實作這個類別。

public class CustomEndpointCollectionElement : StandardEndpointCollectionElement<CustomEndpoint, CustomEndpointElement>
    {
         // ...

    }

下列範例示範如何在延伸區段中註冊標準端點。

<extensions>
      <standardEndpointExtensions>
        <add
          name="customStandardEndpoint"
          type="CustomEndpointCollectionElement, Example.dll,
                Version=1.0.0.0, Culture=neutral, PublicKeyToken=ffffffffffffffff"/>

設定標準端點

標準端點可加入至程式碼或組態中。 若要將標準端點加入至程式碼中,只要將適當的標準端點類型具現化,然後將該端點加入至服務主機即可,如下列範例所示。

serviceHost.AddServiceEndpoint(new CustomEndpoint());

若要將標準端點加入至組態中,請將 <endpoint> 項目加入至 <service> 項目,以及 <standardEndpoints> 項目中任何必要的組態設定。 下列範例會示範如何加入 UdpDiscoveryEndpoint,此為與 .NET Framework 4 一起發行的標準端點之一。

<services>
  <service>
    <endpoint isSystemEndpoint=”true” kind=”udpDiscoveryEndpoint” />
  </service>
</services>
<standardEndpoints>  
  <udpDiscoveryEndpoint>
     <standardEndpoint multicastAddress="soap.udp://239.255.255.250:3702" /> 
  </udpDiscoveryEndpoint>
</ standardEndpoints >

您可以使用 <endpoint> 項目中的類別屬性指定標準端點的類型。 端點是在 <standardEndpoints> 項目中加以設定。 在上述範例中,UdpDiscoveryEndpoint 端點已加入且設定完成。 <udpDiscoveryEndpoint> 項目所包含的 <standardEndpoint> 可設定 UdpDiscoveryEndpointMulticastAddress 屬性。

隨附於 .NET Framework 的標準端點

下表列出隨附於 .NET Framework 4 的標準端點。

  • Mex Endpoint
    標準端點可用於公開服務中繼資料。
  • UdpDiscoveryEndpoint
    預先設定透過 UDP 多點傳送繫結進行探索作業的標準端點。
  • DynamicEndpoint
    使用 WS-Discovery 在執行階段中以動態方式尋找端點位址的標準端點。