Angeben einer EndpunktadresseSpecifying an Endpoint Address

Die gesamte Kommunikation mit einem Windows Communication Foundation (WCF)-Dienst erfolgt über dessen Endpunkte.All communication with a Windows Communication Foundation (WCF) service occurs through its endpoints. Jeder ServiceEndpoint enthält eine Address, eine Binding und einen Contract.Each ServiceEndpoint contains an Address, a Binding, and a Contract. Der Vertrag gibt an, welche Vorgänge verfügbar sind.The contract specifies which operations are available. Die Bindung gibt an, wie eine Kommunikation mit dem Dienst stattfindet, und die Adresse gibt an, wo sich der Dienst befindet.The binding specifies how to communicate with the service, and the address specifies where to find the service. Jeder Endpunkt muss eine eindeutige Adresse haben.Every endpoint must have a unique address. Die Endpunktadresse wird durch die EndpointAddress-Klasse dargestellt, die einen Uniform Resource Identifier (URI) enthält, der die Adresse des Diensts darstellt, eine Identity, die die Sicherheitsidentität des Diensts darstellt, und eine Auflistung der optionalen Headers.The endpoint address is represented by the EndpointAddress class, which contains a Uniform Resource Identifier (URI) that represents the address of the service, an Identity, which represents the security identity of the service, and a collection of optional Headers. Die optionalen Header stellen zusätzliche, ausführlichere Adressinformationen bereit, um den Endpunkt zu identifizieren oder mit ihm zu interagieren.The optional headers provide more detailed addressing information to identify or interact with the endpoint. Die Header können beispielsweise angeben, wie eine eingehende Nachricht zu bearbeiten ist, wohin der Endpunkt eine Antwortnachricht senden sollte, oder welche Instanz eines Diensts für die Bearbeitung einer eingehenden Nachricht verwendet werden soll, wenn mehrere Instanzen verfügbar sind.For example, headers can indicate how to process an incoming message, where the endpoint should send a reply message, or which instance of a service to use to process an incoming message from a particular user when multiple instances are available.

Definition einer EndpunktadresseDefinition of an Endpoint Address

In WCF ein EndpointAddress Modelliert eine endpunktreferenz (EPR), wie in der WS-Adressierungsstandard definiert.In WCF, an EndpointAddress models an endpoint reference (EPR) as defined in the WS-Addressing standard.

Der Adress-URI besteht für die meisten Transporte aus vier Teilen.The address URI for most transports has four parts. Beispielsweise diese URI "http://www.fabrikam.com:322/mathservice.svc/secureEndpoint" besteht aus den folgenden vier Teilen:For example, this URI, "http://www.fabrikam.com:322/mathservice.svc/secureEndpoint" has the following four parts:

  • Schema: http:Scheme: http:

  • Computer: www.fabrikam.comMachine: www.fabrikam.com

  • (Optional) Port: 322(Optional) Port: 322

  • Pfad: /mathservice.svc/secureEndpointPath: /mathservice.svc/secureEndpoint

Bestandteil des EPR-Modells ist, dass jeder Endpunktverweis einige Verweisparameter enthalten kann, die weitere identifizierende Informationen liefern.Part of the EPR model is that each endpoint reference can carry some reference parameters that add extra identifying information. In WCF diese Endpunktverweise als Instanzen der AddressHeader Klasse.In WCF, these reference parameters are modeled as instances of the AddressHeader class.

Die Endpunktadresse für einen Dienst kann entweder verbindlich mithilfe von Code oder deklarativ durch die Konfiguration angegeben werden.The endpoint address for a service can be specified either imperatively by using code or declaratively through configuration. Die Definition von Endpunkten im Code ist normalerweise nicht geeignet, da die Bindungen und Adressen für einen bereitgestellten Dienst sich in der Regel von denen unterscheiden, die während der Entwicklung des Diensts verwendet werden.Defining endpoints in code is usually not practical because the bindings and addresses for a deployed service are typically different from those used while the service is being developed. Im Allgemeinen ist es praktischer, Dienstendpunkte nicht mit Code, sondern mit Konfiguration zu definieren.Generally, it is more practical to define service endpoints using configuration rather than code. Werden die Bindung und die Adressinformationen nicht in den Code integriert, ist eine Änderung ohne Neukompilierung und erneute Bereitstellung der Anwendung möglich.Keeping the binding and addressing information out of the code allows them to change without having to recompile and redeploy the application. Wenn im Code oder in der Konfiguration keine Endpunkte angegeben sind, fügt die Runtime einen Standardendpunkt für alle Basisadressen in jedem Vertrag hinzu, der vom Dienst implementiert wird.If no endpoints are specified in code or in configuration, then the runtime adds one default endpoint on each base address for each contract implemented by the service.

Es gibt zwei Möglichkeiten, Endpunktadressen für einen Dienst in WCF anzugeben.There are two ways to specify endpoint addresses for a service in WCF. Sie können eine absolute Adresse für jeden dem Dienst zugeordneten Endpunkt angeben, oder Sie können eine Basisadresse für den ServiceHost eines Diensts bereitstellen und dann eine relativ zu dieser Basisadresse definierte Adresse für jeden dem Dienst zugeordneten Endpunkt angeben.You can specify an absolute address for each endpoint associated with the service or you can provide a base address for the ServiceHost of a service and then specify an address for each endpoint associated with this service that is defined relative to this base address. Sie können mit jedem dieser Verfahren entweder im Code oder in der Konfiguration die Endpunktadressen für einen Dienst angeben.You can use each of these procedures to specify the endpoint addresses for a service in either configuration or code. Wenn Sie keine relative Adresse angeben, verwendet der Dienst die Basisadresse.If you do not specify a relative address, the service uses the base address. Sie können für einen Dienst auch mehrere Adressen angeben, jedoch ist für jeden Dienst nur eine Basisadresse für jeden Transport zulässig.You can also have multiple base addresses for a service, but each service is allowed only one base address for each transport. Wenn Sie mehrere Endpunkte haben, von denen jeder mit einer anderen Bindung konfiguriert ist, müssen deren Adressen eindeutig sein.If you have multiple endpoints, each of which is configured with a different binding, their addresses must be unique. Endpunkte, die die gleiche Bindung, aber verschiedene Verträge verwenden, können die gleiche Adresse verwenden.Endpoints that use the same binding but different contracts can use the same address.

Wenn Sie in IIS hosten, verwalten Sie die ServiceHost-Instanz nicht selbst.When hosting with IIS, you do not manage the ServiceHost instance yourself. Für einen in IIS gehosteten Dienst ist die Basisadresse immer die in der SVC-Datei angegebene Adresse.The base address is always the address specified in the .svc file for the service when hosting in IIS. Daher müssen Sie relative Endpunktadressen für IIS-gehostete Dienstendpunkte verwenden.So you must use relative endpoint addresses for IIS-hosted service endpoints. Die Angabe einer voll qualifizierten Endpunktadresse kann zu Fehlern bei der Bereitstellung des Diensts führen.Supplying a fully-qualified endpoint address can lead to errors in the deployment of the service. Weitere Informationen finden Sie unter Bereitstellen eines WCF-Diensts (englischsprachig).For more information, see Deploying an Internet Information Services-Hosted WCF Service.

Definieren von Endpunktadressen in der KonfigurationDefining Endpoint Addresses in Configuration

Verwenden Sie zum Definieren eines Endpunkts in einer Konfigurationsdatei der <Endpunkt > Element.To define an endpoint in a configuration file, use the <endpoint> element.

<configuration>
  <system.serviceModel>
    <services>
      <service name="UE.Samples.HelloService"
               behaviorConfiguration="HelloServiceBehavior">
        <endpoint address="/Address1"
                  binding="basicHttpBinding" 
                  contract="UE.Samples.IHello"/>

        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="HelloServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Bei der Open -Methode aufgerufen wird, (d. h., wenn die Hostinganwendung versucht, den Dienst zu starten), sucht das System für eine <Service > Element mit einem Namensattribut, der angibt, "UE. Samples.HelloService".When the Open method is called (that is, when the hosting application attempts to start the service), the system looks for a <service> element with a name attribute that specifies "UE.Samples.HelloService". Wenn die <Service > Element gefunden wird, das System lädt die angegebene Klasse und Endpunkte, die bereitgestellt werden, in der Konfigurationsdatei Endpunktdefinitionen erstellt.If the <service> element is found, the system loads the specified class and creates endpoints using the endpoint definitions provided in the configuration file. Dieser Mechanismus erlaubt Ihnen, mit nur zwei Zeilen Code einen Dienst zu laden und zu starten, ohne dass die Bindungs- und Adressierungsinformationen im Code enthalten sein müssen.This mechanism allows you to load and start a service with two lines of code while keeping binding and addressing information out of your code. Der Vorteil dieses Ansatzes zeigt sich darin, dass diese Änderungen ohne Neukompilierung oder erneute Bereitstellung der Anwendung durchgeführt werden können.The advantage of this approach is that these changes can be made without having to recompile or redeploy the application.

Die optionalen Header in deklariert eine <Header >.The optional headers are declared in a <headers>. Im folgenden ist ein Beispiel für die Elemente verwendet, um die Endpunkte für einen Dienst in einer Konfigurationsdatei angeben, die zwischen zwei Headern unterscheidet: "Gold"-Clients von http://tempuri1.org/ und "Standard"-Clients von http://tempuri2.org/.The following is an example of the elements used to specify endpoints for a service in a configuration file that distinguishes between two headers: "Gold" clients from http://tempuri1.org/ and "Standard" clients from http://tempuri2.org/. Der Client Aufrufen dieses Diensts benötigen die entsprechenden <Header > in der Konfigurationsdatei.The client calling this service must have the appropriate <headers> in its configuration file.

<configuration>
  <system.serviceModel>
    <services>
      <service name="UE.Samples.HelloService"
               behaviorConfiguration="HelloServiceBehavior">
        <endpoint address="/Address1"
                  binding="basicHttpBinding" 
                  contract="UE.Samples.IHello">
          <headers>
            <Member xmlns="http://tempuri1.org/">Gold</Member>
          </headers>
        </endpoint>
        <endpoint address="/Address2"
          binding="basicHttpBinding" 
          contract="UE.Samples.IHello">
          <headers>
            <Member xmlns="http://tempuri2.org/">Silver</Member>
          </headers>
        </endpoint>

        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="HelloServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Header können auch durch einzelne Nachrichten statt (wie vorher gezeigt) durch alle Nachrichten an einem Endpunkt festgelegt werden.Headers can also be set on individual messages instead of all messages on an endpoint (as shown previously). Dies geschieht, indem mithilfe von OperationContextScope ein neuer Kontext in einer Clientanwendung erstellt wird, um der ausgehenden Nachricht einen benutzerdefinierten Header hinzuzufügen. Dies wird im folgenden Beispiel gezeigt.This is done by using OperationContextScope to create a new context in a client application to add a custom header to the outgoing message, as shown in the following example.

SampleServiceClient wcfClient = new SampleServiceClient(new InstanceContext(this));
try
{
  using (OperationContextScope scope = new OperationContextScope(wcfClient.InnerChannel))
  {
    MessageHeader header
      = MessageHeader.CreateHeader(
      "Service-Bound-CustomHeader",
      "http://Microsoft.WCF.Documentation",
      "Custom Happy Value."
      );
    OperationContext.Current.OutgoingMessageHeaders.Add(header);

    // Making calls.
    Console.WriteLine("Enter the greeting to send: ");
    string greeting = Console.ReadLine();

    //Console.ReadLine();
    header = MessageHeader.CreateHeader(
        "Service-Bound-OneWayHeader",
        "http://Microsoft.WCF.Documentation",
        "Different Happy Value."
      );
    OperationContext.Current.OutgoingMessageHeaders.Add(header);

    // One-way
    wcfClient.Push(greeting);
    this.wait.WaitOne();

    // Done with service. 
    wcfClient.Close();
    Console.WriteLine("Done!");
    Console.ReadLine();
  }
}
catch (TimeoutException timeProblem)
{
  Console.WriteLine("The service operation timed out. " + timeProblem.Message);
  Console.ReadLine();
  wcfClient.Abort();
}
catch (CommunicationException commProblem)
{
  Console.WriteLine("There was a communication problem. " + commProblem.Message);
  Console.ReadLine();
  wcfClient.Abort();
}
Dim wcfClient As New SampleServiceClient(New InstanceContext(Me))
Try
  Using scope As New OperationContextScope(wcfClient.InnerChannel)
               Dim header As MessageHeader = MessageHeader.CreateHeader("Service-Bound-CustomHeader", _
                                   "http://Microsoft.WCF.Documentation", "Custom Happy Value.")
	OperationContext.Current.OutgoingMessageHeaders.Add(header)

	' Making calls.
	Console.WriteLine("Enter the greeting to send: ")
	Dim greeting As String = Console.ReadLine()

	'Console.ReadLine();
               header = MessageHeader.CreateHeader("Service-Bound-OneWayHeader", _
                                                   "http://Microsoft.WCF.Documentation", "Different Happy Value.")
	OperationContext.Current.OutgoingMessageHeaders.Add(header)

	' One-way
	wcfClient.Push(greeting)
	Me.wait.WaitOne()

	' Done with service. 
	wcfClient.Close()
	Console.WriteLine("Done!")
	Console.ReadLine()
  End Using
Catch timeProblem As TimeoutException
  Console.WriteLine("The service operation timed out. " & timeProblem.Message)
  Console.ReadLine()
  wcfClient.Abort()
Catch commProblem As CommunicationException
  Console.WriteLine("There was a communication problem. " & commProblem.Message)
  Console.ReadLine()
  wcfClient.Abort()
End Try

Endpunktadresse in MetadatenEndpoint Address in Metadata

Eine Endpunktadresse wird in WSDL (Web Services Description Language) als ein WS-Addressierungs-EndpointReference (EPR)-Element innerhalb des wsdl:port-Elements des entsprechenden Endpunkts dargestellt.An endpoint address is represented in Web Services Description Language (WSDL) as a WS-Addressing EndpointReference (EPR) element inside the corresponding endpoint's wsdl:port element. Der EPR enthält die Endpunktadresse sowie eventuelle Adresseigenschaften.The EPR contains the endpoint's address as well as any address properties. Beachten Sie, dass der EPR in wsdl:port soap:Address ersetzt, wie im folgenden Beispiel gezeigt.Note that the EPR inside wsdl:port replaces soap:Address as seen in the following example.

Definieren von Endpunktadressen in CodeDefining Endpoint Addresses in Code

Eine Endpunktadresse kann mit der EndpointAddress-Klasse im Code erstellt werden.An endpoint address can be created in code with the EndpointAddress class. Der für die Endpunktadresse angegebene URI kann ein voll qualifizierter Pfad oder ein zur Basisadresse des Diensts relativer Pfad sein.The URI specified for the endpoint address can be a fully-qualified path or a path that is relative to the service's base address. Das folgende Codebeispiel zeigt, wie eine Instanz der EndpointAddress-Klasse erstellt und der ServiceHost-Instanz, die den Dienst hostet, hinzugefügt wird.The following code illustrates how to create an instance of the EndpointAddress class and add it to the ServiceHost instance that is hosting the service.

Im folgenden Codebeispiel wird veranschaulicht, wie eine vollständige Endpunktadresse im Code angegeben wird.The following example demonstrates how to specify the full endpoint address in code.

Uri baseAddress = new Uri("http://localhost:8000/HelloService");
string address = "http://localhost:8000/HelloService/MyService";

using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService), baseAddress))
{
    serviceHost.AddServiceEndpoint(typeof(IHello), new BasicHttpBinding(), address);
    serviceHost.Open();
    Console.WriteLine("Press <enter> to terminate service");
    Console.ReadLine();
    serviceHost.Close();
}

Das folgende Codebeispiel zeigt, wie der Basisadresse des Diensthosts eine relative Adresse ("MyService") hinzugefügt wird.The following example demonstrates how to add a relative address ("MyService") to the base address of the service host.

Uri baseAddress = new Uri("http://localhost:8000/HelloService");

using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService), baseAddress))
{
    serviceHost.AddServiceEndpoint(typeof(IHello), new BasicHttpBinding(), "MyService");
    serviceHost.Open();
    Console.WriteLine("Press <enter> to terminate service");
    Console.ReadLine();
    serviceHost.Close();
}

Hinweis

Eigenschaften von ServiceDescription in der Dienstanwendung dürfen nicht im Anschluss an die OnOpening-Methode auf ServiceHostBase geändert werden.Properties of the ServiceDescription in the service application must not be modified subsequent to the OnOpening method on ServiceHostBase. Einige Member, wie die Credentials-Eigenschaft und die AddServiceEndpoint-Methoden auf ServiceHostBase und ServiceHost, lösen eine Ausnahme aus, wenn eine Änderung nach diesem Punkt stattfindet.Some members, such as the Credentials property and the AddServiceEndpoint methods on ServiceHostBase and ServiceHost, throw an exception if modified after that point. Andere Member können geändert werden, wobei das Ergebnis jedoch nicht definiert ist.Others permit you to modify them, but the result is undefined.

Ähnlich verhält es sich mit den ServiceEndpoint-Werten, die auf dem Client nach dem Aufruf von OnOpening auf ChannelFactory nicht geändert werden dürfen.Similarly, on the client the ServiceEndpoint values must not be modified after the call to OnOpening on the ChannelFactory. Die Credentials-Eigenschaft löst eine Ausnahme aus, wenn sie nach diesem Punkt geändert wird.The Credentials property throws an exception if modified after that point. Die anderen Clientbeschreibungswerte können ohne Fehler geändert werden, aber das Ergebnis ist nicht definiert.The other client description values can be modified without error, but the result is undefined.

Sowohl für den Dienst als auch den Client wird empfohlen, die Beschreibung vor dem Aufruf von Open zu ändern.Whether for the service or client, it is recommended that you modify the description prior to calling Open.

Verwenden von StandardendpunktenUsing Default Endpoints

Wenn im Code oder in der Konfiguration keine Endpunkte angegeben sind, stellt die Runtime Standardendpunkte bereit, indem ein Standardendpunkt für alle Basisadressen in jedem Dienstvertrag, der vom Dienst implementiert wird, hinzugefügt wird.If no endpoints are specified in code or in configuration then the runtime provides default endpoints by adding one default endpoint on each base address for each service contract implemented by the service. Die Basisadresse kann im Code oder in der Konfiguration angegeben werden, und die Standardendpunkte werden hinzugefügt, wenn Open auf dem ServiceHost aufgerufen wird.The base address can be specified in code or in configuration, and the default endpoints are added when Open is called on the ServiceHost.

Wenn Endpunkte explizit bereitgestellt werden, können die Standardpunkte dennoch hinzugefügt werden, indem AddDefaultEndpoints auf dem ServiceHost aufgerufen wird, bevor Open aufgerufen wird.If endpoints are explicitly provided, the default endpoints can still be added by calling AddDefaultEndpoints on the ServiceHost before calling Open. Weitere Informationen zu Standardendpunkten, Bindungen und Verhaltensweisen finden Sie unter vereinfachte Konfiguration und vereinfachte Konfiguration für WCF-Dienste.For more information about default endpoints, bindings, and behaviors, see Simplified Configuration and Simplified Configuration for WCF Services.

Siehe auchSee Also

EndpointAddress
Dienstidentität und AuthentifizierungService Identity and Authentication
Übersicht über die EndpunkterstellungEndpoint Creation Overview
HostingHosting