Mehrere Endpunkte unter einem ListenUriMultiple Endpoints at a Single ListenUri

In diesem Beispiel wird ein Dienst gezeigt, der mehrere Endpunkte unter einem einzelnen ListenUri hostet.This sample demonstrates a service that hosts multiple endpoints at a single ListenUri. Dieses Beispiel basiert auf der Einstieg , implementiert einen rechnerdienst.This sample is based on the Getting Started that implements a calculator service.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Wie in der mehrere Endpunkte Beispiel Hosten eines Diensts kann mehrere Endpunkte mit unterschiedlichen Adressen und möglicherweise auch unterschiedlichen Bindungen.As demonstrated in the Multiple Endpoints sample, a service can host multiple endpoints, each with different addresses and possibly also different bindings. In diesem Beispiel wird gezeigt, dass mehrere Endpunkte auch bei der gleichen Adresse gehostet werden können.This sample shows that it is possible to host multiple endpoints at the same address. Außerdem werden in diesem Beispiel die Unterschiede zwischen den beiden Arten der Adressen eines Dienstendpunkts dargestellt: EndpointAddress und ListenUri.This sample also demonstrates the differences between the two kinds of addresses that a service endpoint has: EndpointAddress and ListenUri.

Die EndpointAddress ist die logische Adresse eines Diensts.The EndpointAddress is the logical address of a service. An diese Adresse werden SOAP-Nachrichten adressiert.It is the address that SOAP messages are addressed to. Der ListenUri ist die physische Adresse des Diensts.The ListenUri is the physical address of the service. Er verfügt über die Informationen zu Port und Adresse, an denen der Dienst auf dem aktuellen Computer tatsächlich Nachrichten überwacht.It has the port and address information where the service endpoint actually listens for messages on the current machine. In den meisten Fällen müssen diese Adressen nicht unterschiedlich sein. Wenn ein ListenUri nicht explizit angegeben ist, wird er standardmäßig auf den URI der EndpointAddress des Endpunkts festgelegt.In most cases, there is no need for these addresses to differ; when a ListenUri is not explicitly specified, it defaults to the URI of the EndpointAddress of the endpoint. In einigen Fällen ist es jedoch nützlich, die Adressen zu unterscheiden, z. B. wenn Sie einen Router konfigurieren, der Nachrichten akzeptiert, die möglicherweise an eine Reihe verschiedener Dienste adressiert sind.In a few cases, it is useful to distinguish them, such as when configuring a router, which might accept messages addressed to a number of different services.

DienstService

Der Dienst in diesem Beispiel besitzt zwei Verträge: ICalculator und IEcho.The service in this sample has two contracts, ICalculator and IEcho. Zusätzlich zum üblichen IMetadataExchange-Endpunkt gibt es drei Anwendungsendpunkte, wie im folgenden Code gezeigt.In addition to the customary IMetadataExchange endpoint, there are three application endpoints, as shown in the following code.

<endpoint address="urn:Stuff"  
        binding="wsHttpBinding"  
        contract="Microsoft.ServiceModel.Samples.ICalculator"   
        listenUri="http://localhost/servicemodelsamples/service.svc" />  
<endpoint address="urn:Stuff"  
        binding="wsHttpBinding"  
        contract="Microsoft.ServiceModel.Samples.IEcho"   
        listenUri="http://localhost/servicemodelsamples/service.svc" />  
<endpoint address="urn:OtherEcho"  
        binding="wsHttpBinding"  
        contract="Microsoft.ServiceModel.Samples.IEcho"   
        listenUri="http://localhost/servicemodelsamples/service.svc" />  

Alle drei Endpunkte werden unter demselben ListenUri gehostet und verwenden dieselbe binding. Endpunkte unter demselben ListenUri müssen dieselbe Bindung besitzen, da sie gemeinsam einen einzigen Kanalstapel nutzen, der Nachrichten an dieser physischen Adresse des Computers überwacht.All three endpoints are hosted at the same ListenUri and use the same binding - endpoints at the same ListenUri must have the same binding, because they are sharing a single channel stack that listens for messages at that physical address on the machine. Die address jedes Endpunkts ist ein URN. Obwohl Adressen in der Regel physische Speicherplätze darstellen, kann die Adresse eigentlich ein beliebiger URI sein, da die Adresse für den Abgleich und die Filterung verwendet wird, wie in diesem Beispiel gezeigt.The address of each endpoint is a URN; though typically addresses represent physical locations, in fact the address can be any kind of URI, because the address is used for matching and filtering purposes as is demonstrated in this sample.

Da alle drei Endpunkte denselben ListenUri, wenn eine Nachricht eintrifft, Windows Communication Foundation (WCF) müssen entscheiden, welcher Endpunkt die Nachricht bestimmt ist.Because all three endpoints share the same ListenUri, when a message arrives there, Windows Communication Foundation (WCF) must decide which endpoint the message is destined for. Jeder Endpunkt besitzt einen Nachrichtenfilter, der aus zwei Teilen besteht: dem Adressfilter und dem Vertragsfilter.Each endpoint has a message filter that is comprised of two parts: the address filter and the contract filter. Der Adressfilter gleicht To der SOAP-Nachricht mit der Adresse des Dienstendpunkts ab.The address filter matches the To of the SOAP message to the address of the service endpoint. So sind beispielsweise nur an To "Urn:OtherEcho" adressierte Nachrichten für den dritten Endpunkt dieses Diensts vorgesehen.For example, only messages addressed To "Urn:OtherEcho" are candidates for the third endpoint of this service. Der Vertragsfilter gleicht die den Vorgängen eines besonderen Vertrags zugeordneten Aktionen ab.The contract filter matches the Actions associated with the operations of a particular contract. Nachrichten mit der Aktion von IEchoFor example, messages with the action of IEcho. Echo stimmen beispielsweise mit den Vertragsfiltern des zweiten und dritten Endpunkts dieses Diensts überein, da beide Endpunkte den IEcho-Vertrag hosten.Echo matches the contract filters of both the second and third endpoints of this service, because both of those endpoints host the IEcho contract.

Deshalb ermöglicht es die Kombination aus Adressfilter und Vertragsfilter, jede am ListenUri dieses Diensts eingehende Nachricht zum richtigen Endpunkt weiterzuleiten.Thus the combination of address filter and contract filter makes it possible to route each message that arrives at this service's ListenUri to the correct endpoint. Der dritte Endpunkt wird von den anderen beiden unterschieden, da er Nachrichten akzeptiert, die von den anderen Endpunkten an eine andere Adresse gesendet wurden.The third endpoint is differentiated from the other two because it accepts messages sent to a different address from the other endpoints. Der erste und der zweite Endpunkt werden anhand ihrer Verträge (die Aktion der eingehenden Nachricht) voneinander unterschieden.The first and second endpoints are differentiated from each other based on their contracts (the Action of the incoming message).

ClientClient

So wie Endpunkte auf dem Server zwei verschiedene Adressen besitzen, weisen Clientendpunkte auch zwei Adressen auf.Just as endpoints on the server have two different addresses, client endpoints also have two addresses. Sowohl auf dem Server als auch auf dem Client lautet die logische Adresse EndpointAddress.On both server and client, the logical address is called the EndpointAddress. Die physische Adresse wird jedoch auf dem Server ListenUri und auf dem Client Via genannt.But whereas the physical address is called the ListenUri on the server, on the client, the physical address is called the Via.

Wie auf dem Server sind diese beiden Adressen standardmäßig identisch.As on the server, by default, these two addresses are the same. Um einen Via auf dem Client anzugeben, der sich von der Adresse des Endpunkts unterscheidet, wird ClientViaBehavior verwendet:To specify a Via on the client that is different from the endpoint's address, ClientViaBehavior is used:

Uri via = new Uri("http://localhost/ServiceModelSamples/service.svc");  
CalculatorClient calcClient = new CalculatorClient();  
calcClient.ChannelFactory.Endpoint.Behaviors.Add(  
        new ClientViaBehavior(via));  

Wie üblich kommt die Adresse aus der Clientkonfigurationsdatei, die von "Svcutil.exe" generiert wurde.As usual, the address comes from the client configuration file, which was generated by Svcutil.exe. Via (entspricht ListenUri des Diensts) wird nicht in den Metadaten des Diensts angezeigt, weshalb diese Information dem Client out-of-band mitgeteilt werden muss (genauso wie die Metadatenadresse des Diensts).The Via (which corresponds to the ListenUri of the service) does not appear in the service's metadata and so this information must be communicated to the client out-of-band (just like the service's metadata address).

In diesem Beispiel sendet der Client Nachrichten an jeden der drei Endpunkte des Servers, um zu zeigen, dass er mit allen drei Endpunkten kommunizieren (und sie unterscheiden) kann, selbst dann, wenn sie alle denselben Via besitzen.The client in this sample sends messages to each of the server's three application endpoints, to demonstrate that it can communicate with (and differentiate) all three endpoints, even though they all have the same Via.

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

    Hinweis

    Bei einer computerübergreifenden Konfiguration müssen Sie "localhost" in der Datei "Client.cs" durch den Namen des Dienstcomputers ersetzen.For cross-machine, you must replace localhost in the Client.cs file with the name of the service machine.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Services\MultipleEndpointsSingleUri

Siehe auchSee Also