Freigeben über


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 benutzerdefinierten Endpunkt in einer Konfigurationsdatei zu verwenden, müssen Sie eine Klasse von StandardEndpointElement ableiten, eine Klasse von StandardEndpointCollectionElement ableiten und den neuen Standardendpunkt in der Datei "app.config" oder "machine.config" im Abschnitt mit den Erweiterungen registrieren. Das StandardEndpointElement-Objekt bietet Konfigurationsunterstützung für den Standardendpunkt. Dies wird im folgenden Beispiel veranschaulicht.

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)
        {
        }
    }

Das StandardEndpointCollectionElement-Objekt 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"/>

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 der Konfiguration hinzuzufügen, fügen Sie dem <service>-Element ein <endpoint>-Element sowie alle erforderlichen Konfigurationseinstellungen im <standardEndpoints>-Element hinzu. Im folgenden Beispiel wird gezeigt, wie Sie ein UdpDiscoveryEndpoint-Objekt hinzufügen. Dabei handelt es sich um einen der Standardendpunkte, die im Lieferumfang von .NET Framework 4 enthalten sind.

<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 mithilfe des kind-Attributs im <endpoint>-Element angegeben. Der Endpunkt wird innerhalb des <standardEndpoints>-Elements 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 im Lieferumfang von .NET Framework 4 enthaltenen Standardendpunkte aufgeführt.

  • 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 die WS-Suche verwendet, um zur Laufzeit dynamisch nach der Endpunktadresse zu suchen.
  • 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.