Freigeben über


Clientanwendungen mittlerer Ebene

In diesem Thema werden verschiedene Probleme bezüglich Clientanwendungen mittlerer Ebene diskutiert, von denen Windows Communication Foundation (WCF) verwendet wird.

Verbessern der Leistung von Clients mittlerer Ebene

Im Vergleich zu früheren Kommunikationstechnologien wie Webdiensten unter Verwendung von ASP.NET kann das Erstellen einer WCF-Clientinstanz aufgrund der umfangreichen Funktionen von WCF etwas komplexer ausfallen. Beispiel: Beim Öffnen eines ChannelFactory<TChannel>-Objekts kann von diesem Objekt eine sichere Sitzung mit dem Dienst hergestellt werden, was zu einer Verlängerung der Startzeit der Clientinstanz führt. Üblicherweise haben diese zusätzlichen Funktionen keine sonderlich großen Auswirkungen auf Clientanwendungen, da vom WCF-Client lediglich einige Aufrufe ausgeführt werden und er anschließend geschlossen wird.

Von Clientanwendungen mittlerer Ebene kann jedoch in kurzer Zeit eine Vielzahl von WCF-Clientobjekten erstellt werden. Daher hat dieser Typ höhere Initialisierungsanforderungen. Für die Leistungsoptimierung von Anwendungen mittlerer Ebene beim Aufrufen von Diensten haben Sie die Wahl zwischen zwei grundsätzlichen Vorgehensweisen:

  • Zwischenspeichern des WCF-Clientobjekts und anschließendes Wiederverwenden des Objekts für alle nachfolgenden Aufrufe (sofern möglich)

  • Erstellen eines ChannelFactory<TChannel>-Objekts und anschließendes Verwenden des Objekts zum Erstellen neuer WCF-Clientkanalobjekte für jeden Aufruf

Bei diesen Vorgehensweisen sollten Sie Folgendes beachten:

  • Wird vom Dienst ein clientspezifischer Zustand mithilfe einer Sitzung verwaltet, kann der WCF-Client mittlerer Ebene nicht mit mehrfachen Clientebenenanforderungen wiederverwendet werden, da der Zustand des Diensts direkt an den des Clients mittlerer Ebene gebunden ist.

  • Wenn der Dienst einzeln pro Client authentifiziert werden muss, ist das Erstellen eines neuen Clients für jede eingehende Anforderung mittlerer Ebene erforderlich. Das Wiederverwenden des WCF-Clients mittlerer Ebene (oder des WCF-Clientkanalobjekts) ist nicht möglicht, da die Anmeldeinformationen des Clients mittlerer Ebene nicht nach dem Erstellen des WCF-Clients (oder nach dem Erstellen von ChannelFactory<TChannel>) geändert werden können.

  • Channels und von den Channels erstellte Clients sind zwar threadsicher, unterstützen jedoch möglicherweise keine gleichzeitigen Schreibvorgänge mehrerer Nachrichten zur Übertragung. Beim Senden umfangreicher Nachrichten (und besonders beim Streaming) wird der Sendevorgang möglicherweise blockiert, da auf den Abschluss eines anderen Sendevorgangs gewartet wird. Daraus ergeben sich zwei Probleme: fehlende Parallelität und die Gefahr eines Deadlocks, wenn die Ablaufsteuerung wieder zu dem Dienst zurückkehrt, von dem der Channel wiederverwendet wird (oder mit anderen Worten: Wenn vom freigegebenen Client ein Dienst aufgerufen wird, dessen Codepfad einen Rückruf an den freigegebenen Client auslöst). Dies gilt unabhängig vom Typ des wiederverwendeten WCF-Clients.

  • Fehler in Channels müssen unabhängig davon behoben werden, ob der Channel freigegeben ist. Beim Wiederverwenden von Channels kann ein fehlerhafter Channel dazu führen, dass gleich mehrere ausstehende Anforderungen oder Sendevorgänge nicht ausgeführt werden.

Im folgenden Beispiel finden Sie empfohlene Vorgehensweisen zum Wiederverwenden eines Clients für mehrere Anforderungen: Datenbindung in einem ASP.NET-Client.

Darüber hinaus können Sie die Leistung beim Starten von Clients verbessern, von denen serialisierbare Datentypen verwendet werden. Für die Serialisierung dieser Datentypen wird der Serialisierungscode von XmlSerializer zum Generieren und Kompilieren zur Laufzeit verwendet, was eine Beeinträchtigung der Leistung beim Start zur Folge haben kann. Mithilfe des ServiceModel Metadata Utility-Tools (Svcutil.exe) lässt sich die Startleistung dieser Anwendungen verbessern, indem der erforderliche Serialisierungscode aus den kompilierten Assemblys für die Anwendung generiert wird. Weitere Informationen finden Sie unter Vorgehensweise: Verbessern der Startzeit von WCF-Clientanwendungen mit dem XmlSerializer.

Siehe auch