Freigeben über


Erweiterte Webprogrammierung

Dieses Beispiel veranschaulicht einige der erweiterten Funktionen des Windows Communication Foundation (WCF)-Webprogrammiermodells. Im Beispiel werden die folgenden Konzepte dargestellt:

  • URI Template Dispatch: Ermöglicht die Bindung von Dienstvorgängen an externe URIs, die zu einem angegebenen Muster passen.
  • HTTP Methods: Dienstvorgänge können von beliebigen HTTP-Methoden aufgerufen werden, einschließlich GET, PUT, POST und DELETE.
  • HTTP Headers: Dienste können den Inhalt von HTTP-Headern mithilfe von WebOperationContext bearbeiten.

Tipp

Zum Erstellen und Ausführen dieses Beispiels muss .NET Framework, Version 3.5 installiert sein. Zum Öffnen des Projekts und der Projektmappendateien ist Visual Studio 2008 erforderlich.

Das Beispiel implementiert eine Basisauflistung der Kundendaten, die im Arbeitsspeicher gespeichert sind. Es unterstützt grundlegende Create-, Read-, Update- und Delete-Vorgänge, die unter Verwendung von URIs und HTTP-Methoden extern verfügbar gemacht werden.

Dienstvertrag und Implementierung

In diesem Beispiel implementiert der Dienst einen einzelnen Endpunkt, der eine URI-Basisadresse (https://localhost:8000/Customers) überwacht. Der Dienst behandelt Anforderungen für URIs unter diesem Präfix folgendermaßen:

  • GET-Anforderungen für https://localhost:8000/Customers werden an GetCustomers() weitergeleitet.
  • Jeder Kunde im System besitzt einen eindeutigen Bezeichner, der in der URI übermittelt wird. GET-Anforderungen für diese URIs (z. B. https://localhost:8000/Customers/1) werden GetCustomer() zugeordnet.
  • Einzelne Kunden können aktualisiert werden, indem eine HTTP PUT-Anforderung an den URI des Kunden ausgegeben wird.
  • Ein Kunde kann aus dem System entfernt werden, indem HTTP DELETE an den URI des Kunden ausgegeben wird.
  • Dem System können neue Daten hinzugefügt werden, indem HTTP POST an den Basis-URI ausgegeben wird.
[ServiceContract]
public interface ICustomerCollection
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "")]
    Customer AddCustomer(Customer customer);

    [OperationContract]
    [WebInvoke(Method = "DELETE", UriTemplate = "{id}")]
    void DeleteCustomer(string id);

    [OperationContract]
    [WebGet(UriTemplate = "{id}")]
    Customer GetCustomer(string id);

    [OperationContract]
    [WebGet(UriTemplate = "")]
    List<Customer> GetCustomers();

    [OperationContract]
    [WebInvoke(Method = "PUT", UriTemplate = "{id}")]
    Customer UpdateCustomer(string id, Customer newCustomer);
}

Der Dienstvertrag wird von der Service-Klasse implementiert, die WCF-Singleton-Instanziierung verwendet. Alle empfangenen Anforderungen werden an die gleiche Objektinstanz auf dem Server weitergeleitet, sodass die Hashtabelle des Kunden für mehrere Anforderungen verwendet werden kann.

[ServiceBehavior( InstanceContextMode = InstanceContextMode.Single )]
public class Service : ICustomerCollection
{
   Hashtable customers = new Hashtable();
   ...
}        

Der GetCustomers()-Vorgang kann durch die Ausgabe einer HTTP GET-Anforderung an den Basis-URI (beispielsweise https://localhost:8000/Customers) aufgerufen werden. Der Customer-Typ wird mit dem Data Contract Serializer serialisiert.

public List<Customer> GetCustomers()
{
    List<Customer> list = new List<Customer>();

    foreach (Customer c in this.customers.Values)
    {
        list.Add(c);
    }

    return list;
}

Einzelne Kunden können abgerufen werden, indem eine GET-Anforderung an den eindeutigen URI des Kunden ausgegeben wird. Beispielsweise kann der Kunde mit der ID 1 über https://localhost:8000/Customers/1 abgerufen werden. Entsprechend kann über http:/localhost:8000/Customers/2 auf Kunde 2 zugegriffen werden. Beide URIs werden an die GetCustomer(string id)-Methode auf dem Server weitergeleitet. Diese Zuordnung wird durch das [WebGet( UriTemplate="{id}")]-Attribut erstellt, das auf den GetCustomer()-Vorgangsvertrag angewendet wird. Die UriTemplate ist ein Muster, das den Satz von URIs beschreibt, den der GetCustomer()-Vorgang behandelt. In diesem Fall beschreibt das Muster alle URIs, die nach der Basisadresse des Endpunkts genau ein Segment besitzen. Der Inhalt dieses Segments wird der {id}-Vorlagenvariablen zugeordnet und durch den WCF-Verteiler an den Methodenparameter id übergeben.

//[WebGet( UriTemplate=”{id}” )]
public Customer GetCustomer(string id)
{
    Customer c = this.customers[id] as Customer;
      
    if (c == null)
    {
        WebOperationContext.Current.OutgoingResponse.SetStatusAsNotFound();
        return null;
    }

    return c;
}

Die Implementierung von GetCustomer() sucht nach der Kunden-ID (bereitgestellt im URI) und gibt den zugeordneten Kunden zurück. Wenn kein Kunde gefunden wird, gibt der Vorgang unter Verwendung der WebOperationContext-Methode eine HTTP 404-Antwort zurück, um den Antwortstatuscode festzulegen.

Beachten Sie, dass die UpdateCustomer()- und die DeleteCustomer()-Methode außerdem mit der gleichen URI-Vorlage verbunden sind wie die GetCustomer()-Methode. Das WCF-Webprogrammiermodell gestattet die Bindung von mehreren Vorgängen an die gleiche URI-Vorlage, sofern diese unterschiedlichen HTTP-Methoden zugeordnet sind. In diesem Fall ist die UpdateCustomer()-Methode an die HTTP PUT-Methode gebunden, während der DeleteCustomer()-Vorgang an die HTTP DELETE-Methode gebunden ist.

[OperationContract]
[WebInvoke( Method="PUT", UriTemplate="{id}")]
Customer UpdateCustomer(string id, Customer newCustomer);

[OperationContract]
[WebInvoke( Method="DELETE", UriTemplate="{id}" )]
void DeleteCustomer(string id);

Die AddCustomer()-Methode veranschaulicht die Verwendung der neuen UriTemplate-Klasse, um neue URIs zu erstellen, die einem bestimmten Muster folgen. Die WebOperationContext()-Methode wird verwendet, um eine HTTP CREATED-Antwort mit dem location-Header zurückzugeben, der auf den URI des neu erstellten Kunden festgelegt ist.

public Customer AddCustomer(Customer customer)
{
    lock (writeLock)
    {
        counter++;
        UriTemplateMatch match = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;

        UriTemplate template = new UriTemplate("{id}");
        customer.Uri = template.BindByPosition(match.BaseUri, counter.ToString());

        customers[counter.ToString()] = customer;
        WebOperationContext.Current.OutgoingResponse.SetStatusAsCreated(customer.Uri);
    }

    return customer;
}

Diensthosting

Der Dienst wird mithilfe von WebServiceHost() gehostet, und ein Endpunkt wird unter Verwendung von WebHttpBinding() verfügbar gemacht.

using (WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("https://localhost:8000/Customers")))
{
    //WebServiceHost will automatically create a default endpoint at the base address using the WebHttpBinding
    //and the WebHttpBehavior, so there's no need to set it up explicitly
    host.Open();
    ...
}

Client

Der Client wird mithilfe der WebChannelFactory-Methode erstellt, um einen Kanal für den Remotedienst zu erstellen.

using (WebChannelFactory<ICustomerCollection> cf = new WebChannelFactory<ICustomerCollection>( baseAddress ))
{
    //WebChannelFactory will default to using the WebHttpBinding with the WebHttpBehavior,
    //so there's no need to set up the endpoint explicitly
    ICustomerCollection channel = cf.CreateChannel();
    ...
}

Der Client, der den Kanal verwendet, gibt eine Reihe von Anforderungen an den Server aus, der den Zustand der Kundenauflistung ändert.

Ausgabe

Hinzufügen einiger Kunden mithilfe von POST:

Alice 123 Pike Place https://localhost:8000/Customers/1
Bob 2323 Lake Shore Drive https://localhost:8000/Customers/2

Verwenden von PUT, um einen Kunden zu aktualisieren:

Charlie 123 Pike Place https://localhost:8000/Customers/1

Verwenden von GET, um die Liste von Kunden abzurufen:

Charlie 123 Pike Place https://localhost:8000/Customers/1
Bob 2323 Lake Shore Drive https://localhost:8000/Customers/2

Using DELETE to delete a customer:

Abschließende Liste von Kunden:

Charlie 123 Pike Place https://localhost:8000/Customers/1

Nachdem die Interaktion abgeschlossen wurde, wartet das Programm auf einen Tastendruck und wird dann beendet.

So richten Sie das Beispiel ein, erstellen es und führen es aus

  1. Vergewissern Sie sich, dass Sie die Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation ausgeführt haben.

  2. Zum Erstellen der C#- oder Visual Basic .NET-Edition der Projektmappe befolgen Sie die unter Erstellen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.

  3. Wenn Sie das Beispiel in einer Konfiguration mit einem einzigen Computer oder computerübergreifend ausführen möchten, befolgen Sie die unter Durchführen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.

Siehe auch

Aufgaben

Beispiel für ein einfaches Webprogrammiermodell

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.