標準端點
端點會由位址、繫結和合約指定。 其他可能會在端點上設定的參數包括行為組態、標頭和接聽 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> 可設定 UdpDiscoveryEndpoint 的 MulticastAddress 屬性。
隨附於 .NET Framework 的標準端點
下表列出隨附於 .NET Framework 4 的標準端點。
- Mex Endpoint
標準端點可用於公開服務中繼資料。
- AnnouncementEndpoint
服務用於傳送公告訊息的標準端點。
- DiscoveryEndpoint
服務用於傳送探索訊息的標準端點。
- UdpDiscoveryEndpoint
預先設定透過 UDP 多點傳送繫結進行探索作業的標準端點。
- UdpAnnouncementEndpoint
服務可使用標準端點,在 UDP 繫結上傳送公告訊息。
- DynamicEndpoint
使用 WS-Discovery 在執行階段中以動態方式尋找端點位址的標準端點。
- ServiceMetadataEndpoint
中繼資料交換所適用的標準端點。
- WebHttpEndpoint
具有 WebHttpBinding 繫結,會自動加入 WebHttpBehavior 行為的標準端點。
- WebScriptEndpoint
具有 WebHttpBinding 繫結,會自動加入 WebScriptEnablingBehavior 行為的標準端點。
- WebServiceEndpoint
具有 WebHttpBinding 繫結的標準端點。
- WorkflowControlEndpoint
標準端點,這個端點可讓您在工作流程執行個體上呼叫控制作業。
- WorkflowHostingEndpoint
可支援工作流程建立和書籤繼續的標準端點。