Von der Datenbank bis zur Oberfläche mit .NET, Teil 2: Application Server und Webservices

Seite 2: Dienstimplementierung

Inhaltsverzeichnis

Für die Dienstimplementierung gilt nun, der Projektmappe erneut ein Projekt hinzuzufügen. Dazu wählt der Entwickler auf dem Ast Solution den Kontextmenüeintrag Add | New Project und dann im Dialog aus der Rubrik "WCF" die Vorlage WCF Service Library. Der Name soll WWWings_Dienste sein. Nach dem Anlegen des Projekts muss er mit Add Reference Verweise zu den Projekten WWWings_GL und WWWings_GO erzeugen.

Microsofts Service-Library-Vorlage enthält die Implementierung eines einfachen "Hallo Welt"-Dienstes in Form von Service1.cs und IService.cs. Diese beiden Dateien sollte man jetzt löschen und stattdessen eine neue Klassendatei BuchungsService.cs anlegen. Die Klasse BuchungsService muss die Schnittstellen IBuchungsService und IDisposable realisieren. Bei der Implementierung hilft Visual Studio, indem der Entwickler auf dem Wort IBuchungsService oder IDisposable im Smarttag-Menü Implement Interface wählt. Visual Studio fügt dann die Signaturen der zu implementierenden Methoden in die Quellcodedatei ein. Die Implementierung (Listing 3) ist typischerweise nur die Weiterleitung an die Geschäftslogik im Sinne einer reinen Dienstfassade.

Die Klasse IBuchungsService besitzt eine Annotation [ServiceBehavior] mit InstanceContextMode.PerCall. Das bedeutet, dass WCF bei jedem Aufruf einer Webservice-Operation eine eigene Instanz der Dienstklasse erzeugt. Das stellt sicher, dass die die Operationen zustandslos sind, auch wenn statt HTTP ein Kommunikationsprotokoll (z. B. TCP) zum Einsatz käme, das Sitzungen realisiert. Hier könnte man auch den ConcurrencyMode verändern. Im Standard steht er auf Single, was hier korrekt ist, weil jede Operation in einer eigenen Instanz läuft und jede Instanz automatisch in einem eigenen Thread. So lassen sich zahlreiche Anfragen parallel bearbeiten. Die Skalierbarkeit wird dann nur noch durch die <serviceThrottling>-Einstellungen (siehe weiter hinten) beschränkt.

Im Fall des Nachrichtenstils muss der Entwickler zudem die Nachrichten in die Nachrichtenobjekte einpacken beziehungsweise aus den Nachrichtenobjekten auspacken. Er könnte alternativ den Nachrichtenstil auch in Geschäftslogik- und Datenzugriffsschicht verwenden. Dort hat er das Versionierungsproblem aber meist nicht, zumal er dort auch Instrumente wie Methodenüberladungen und optionale Parameter verwenden kann.

Nach der Dienstimplementierung wird nun noch ein Server (alias Prozess-Host) benötigt, der den Dienst für den Aufruf durch Clients bereitstellt. Zum Betrieb der Anwendung soll später Microsofts Internet Information Server (IIS) einsetzbar sein. In diesem Tutorial kommt erst mal sein kleiner Bruder, der Visual Studio Development Web Server, zum Einsatz, der in der Entwicklungsumgebung enthalten ist und automatisch startet, wenn man ein Webprojekt aus der Entwicklungsumgebung heraus startet.

Zum Anlegen des Serverprojekts wählt der Entwickler auf dem Ast Solution den Kontextmenüeintrag Add | New Project und dann in diesem Dialog aus der Rubrik "Web" die Vorlage ASP.NET Empty Web Application (auch wenn es hier gar nicht um ASP.NET geht, ist das die richtige Vorlage. Der Name ist ungünstig gewählt). Der Name soll WWWings_Server sein.

Nach dem Anlegen des Projekts muss der Entwickler mit Add Reference Verweise zu den Projekten WWWings_Dienste und WWWings_GO erzeugen. Außerdem muss er (wie schon im ersten Teil des Tutorials) die Verbindungszeichenfolge in dieses Projekt übernehmen, denn diese ist in jedem eigenständigen Prozess zu konfigurieren. Das geht aber nicht per Kopieren der ganzen app.config-Datei aus WWWings_GO, denn bei Webprojekten muss die Datei web.config heißen und weitere Einträge enthalten. Daher kopiert man aus WWWings_GO/app.config nur den Teil

<connectionStrings>
<add name="WWWingsModellContainer" connectionString=
"metadata=res://*/WWWingsModell.csdl|res://*/WWWingsModell
.ssdl|res://*/WWWingsModell.msl;provider=System.Data.SqlClient;
provider connection string=&quot;data source=
.\sqlexpress;initial catalog=WWWings;integrated security=True;
multipleactiveresultsets=True;App=EntityFramework&quot;"
providerName="System.Data.EntityClient" />
</connectionStrings>

in die automatisch angelegte web.config[(i]-Datei von [i]WWWings_Server, und zwar unbedingt zwischen (!) die Tags <configuration> und <system.web>.

Zum Bereitstellen eines Dienstes in einem Webprojekt benötigt man eine .svc-Datei mit genau einer Zeile:

<%@ ServiceHost Language="C#" Debug="true" Service=
"WWWings_Dienste.BuchungsService" %>

Leider ist keine der in Visual Studio mitgelieferten Elementvorlagen in der Situation hilfreich, deshalb verwendet der Entwickler am besten die allgemeine Vorlage "Text File", um eine leere Datei BuchungsService.svc dem Projekt WWWings_Server hinzuzufügen. Die obige Seitendirektive fügt er dort ein. Im letzten Schritt sollte er nun noch die Portnummer für den HTTP-Server festlegen, da Visual Studio sonst selbst eine wählt. Diese Einstellung erreicht man über Properties im Kontextmenü von WWWings_Server. Dort auf der Registerkarte "Web" wählt der Entwickler "Specific Port" und dann zum Beispiel 81. Alternativ kann er auch festlegen, dass die Webservices im IIS hosten sollen. Dazu muss er aber den IIS entsprechend konfigurieren.

Für einen ersten Test der Webservices lässt sich nun im Kontextmenü der Datei BuchungsService.svc die Aktion View in Browser wählen. Webservices sind zwar für den Aufruf durch andere Prozesse und nicht durch Browser vorgesehen, die WCF-Webservices sind aber so nett, eine HTML-Informationsseite für Browser zu liefern (siehe Abb. 2). Wenn der Leser die Meldung "You have created a service.", den Hyperlink zum WSDL-Dokument und Informationen zum Erstellen eines Clients im Browser sieht, ist das ein gutes Indiz dafür, dass alles richtig ist. Es beweist aber noch nicht, dass die Dienste wirklich funktionieren. Dazu soll nun der zuvor erstellte Testclient verändert werden.

Testseite fĂĽr den erstellten Webservice (Abb. 2)