Standardendpunkte

Endpunkte werden definiert, indem eine Adresse, eine Bindung und ein Vertrag angegeben wird. Andere Parameter, die für einen Endpunkt festgelegt werden können, sind beispielsweise Verhaltenskonfigurationen, Header und Abhör-URIs. Für bestimmte Typen von Endpunkten ändern sich diese Werte nicht. Beispielsweise verwenden Metadatenaustausch-Endpunkte immer den IMetadataExchange-Vertrag. Andere Endpunkte, z. B. WebHttpEndpoint, erfordern immer ein angegebenes Endpunktverhalten. Die Verwendbarkeit eines Endpunkts kann verbessert werden, indem für häufig verwendete Endpunkteigenschaften Endpunkte mit Standardwerten verwendet werden. Mithilfe von Standardendpunkten können Entwickler einen Endpunkt definieren, der über Standardwerte verfügt oder für den sich eine oder mehrere Endpunkteigenschaften nicht ändern. Mit diesen Endpunkten können Sie einen solchen Endpunkt verwenden, ohne Informationen statischer Natur angeben zu müssen. Standardendpunkte können für Infrastruktur- und Anwendungsendpunkte verwendet werden.

Infrastrukturendpunkte

Es kann sein, dass ein Dienst Endpunkte verfügbar macht, für die einige Eigenschaften vom Dienstautor nicht explizit implementiert wurden. Der Metadatenaustausch-Endpunkt macht z. B. den IMetadataExchange-Vertrag verfügbar. Als Dienstautor implementieren Sie diese Schnittstelle jedoch nicht, sondern sie wird von der WCF implementiert. Solche Infrastrukturendpunkte haben Standardwerte für eine oder mehrere Endpunkteigenschaften, von denen einige ggf. unveränderbar sind. Die Contract-Eigenschaft des Metadatenaustausch-Endpunkts muss IMetadataExchange sein, während andere Eigenschaften wie die Bindung vom Entwickler angegeben werden können. Infrastrukturendpunkte werden identifiziert, indem die IsSystemEndpoint-Eigenschaft auf true festgelegt wird.

Anwendungsendpunkte

Anwendungsentwickler können eigene Standardendpunkte definieren, die Standardwerte für die Adresse, die Bindung oder den Vertrag angeben. Sie definieren einen Standardendpunkt, indem Sie eine Klasse von ServiceEndpoint ableiten und die entsprechenden Endpunkteigenschaften festlegen. Sie können Standardwerte für Eigenschaften bereitstellen, die geändert werden können. Einige andere Eigenschaften verfügen über statische Werte, die sich nicht ändern können. Das folgende Beispiel zeigt, wie Sie einen Standardendpunkt implementieren.

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; }
}

Um einen benutzerseitig definierten angepassten Endpunkt in einer Konfigurationsdatei zu verwenden, müssen Sie eine Klasse von StandardEndpointElement und eine Klasse von StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> ableiten sowie den neuen Standardendpunkt im Abschnitt „extensions“ der Datei „app.config“ oder „machine.config-“ registrieren. Das StandardEndpointElement bietet Konfigurationsunterstützung für den Standardendpunkt, wie im folgenden Beispiel gezeigt.

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<TStandardEndpoint,TEndpointConfiguration> stellt den Unterstützungstyp für die Auflistung bereit, die unter dem <standardEndpoints>-Abschnitt in der Konfiguration für den Standardendpunkt angezeigt wird. Im folgenden Beispiel wird die Implementierung dieser Klasse veranschaulicht.

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

Im folgenden Beispiel wird gezeigt, wie Sie einen Standardendpunkt im Abschnitt für die Erweiterungen registrieren.

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

Konfigurieren eines Standardendpunkts

Standardendpunkte können im Code oder in der Konfiguration hinzugefügt werden. Um einen Standardendpunkt im Code hinzuzufügen, instanziieren Sie einfach den entsprechenden Standardendpunkttyp und fügen diesen dem Diensthost wie im folgenden Beispiel dargestellt hinzu:

serviceHost.AddServiceEndpoint(new CustomEndpoint());  

Um einen Standardendpunkt in die Konfiguration einzufügen, fügen Sie ein <endpoint>-Element zum <service>-Element und alle erforderlichen Konfigurationseinstellungen im <standardEndpoints>-Element hinzu. Das folgende Beispiel zeigt, wie Sie einen UdpDiscoveryEndpoint hinzufügen, einen der im Lieferumfang von .NET Framework 4.6.1 enthaltenen Standardendpunkte.

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

Der Typ des Standardendpunkts wird mit dem Attribut „kind“ im Element <endpoint> angegeben. Der Endpunkt wird innerhalb des Elements <standardEndpoints> konfiguriert. Im obigen Beispiel wird ein UdpDiscoveryEndpoint-Endpunkt hinzugefügt und konfiguriert. Das <udpDiscoveryEndpoint>-Element enthält einen <standardEndpoint>, der die MulticastAddress-Eigenschaft von UdpDiscoveryEndpoint festlegt.

Im Lieferumfang von .NET Framework enthaltene Standardendpunkte

In der folgenden Tabelle sind die Standardendpunkte aufgeführt, die zum Lieferumfang von .NET Framework 4.6.1 gehören.

Mex Endpoint
Ein Standardendpunkt, der verwendet wird, um Dienstmetadaten verfügbar zu machen.

AnnouncementEndpoint
Ein Standardendpunkt, der von Diensten verwendet wird, um Ankündigungsmeldungen zu senden.

DiscoveryEndpoint
Ein Standardendpunkt, der von Diensten verwendet wird, um Suchmeldungen zu senden.

UdpDiscoveryEndpoint
Ein Standardendpunkt, der für Suchvorgänge über eine UDP-Multicastbindung vorkonfiguriert ist.

UdpAnnouncementEndpoint
Ein Standardendpunkt, der von Diensten verwendet wird, um Ankündigungsmeldungen über eine UDP-Bindung zu senden.

DynamicEndpoint
Ein Standardendpunkt, der WS-Discovery verwendet, um zur Laufzeit dynamisch nach der Endpunktadresse zu suchen.

ServiceMetadataEndpoint
Ein Standardendpunkt für den Metadatenaustausch.

WebHttpEndpoint
Ein Standardendpunkt mit einer WebHttpBinding-Bindung, die das WebHttpBehavior-Verhalten automatisch hinzufügt.

WebScriptEndpoint
Ein Standardendpunkt mit einer WebHttpBinding-Bindung, die das WebScriptEnablingBehavior-Verhalten automatisch hinzufügt.

WebServiceEndpoint
Ein Standardendpunkt mit einer WebHttpBinding-Bindung.

WorkflowControlEndpoint
Ein Standardendpunkt, der es Ihnen ermöglicht, Steuerungsvorgänge für Workflowinstanzen aufzurufen.

WorkflowHostingEndpoint
Ein Standardendpunkt, der die Workflowerstellung und die Wiederaufnahme von Lesezeichen unterstützt.