Beispiel zum Statuscomputer-Workflowdienst
In diesem Beispiel wird das Erstellen eines Workflowdiensts mithilfe eines Statuscomputerworkflows veranschaulicht. Außerdem wird das Implementieren eines Rechners mithilfe des Statuscomputerworkflows beschrieben und ein Prozess mit langer Laufzeit veranschaulicht, bei dem der Status automatisch gespeichert wird. Wenn Sie den Workflowdienst neu starten, kann der Client mit der gleichen Instanz des Workflowdiensts kommunizieren, da der Status des Workflows beibehalten wird. Im Beispiel wird darüber hinaus gezeigt, wie die Protokolle auf Anwendungsebene im Vertrag erzwungen werden können, damit der Workflow eine Ausnahme auslöst, wenn ein Vorgang unerwartet im Dienst aufgerufen wird.
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.
Weitere Informationen zum Einrichten dieses Beispiels finden Sie unter One-time Setup Procedure for Windows Communication Foundation Samples.
Der Dienst implementiert den im folgenden Beispielcode veranschaulichten ICalculator
-Dienstvertrag.
[ServiceContract(Namespace = "http://Microsoft.WorkflowServices.Samples")]
public interface ICalculator
{
[OperationContract()]
int PowerOn();
[OperationContract()]
int Add(int value);
[OperationContract()]
int Subtract(int value);
[OperationContract()]
int Multiply(int value);
[OperationContract()]
int Divide(int value);
[OperationContract()]
void PowerOff();
}
Im Beispiel wird ein Satz von Zuständen implementiert, die jeweils über einen Satz von Ereignishandlern verfügen. Jeder Ereignishandler enthält eine Receive-Aktivität, die eine Operation im ICalculator
-Vertrag implementiert. Da er sich in einem bestimmten Zustand befindet, kann der Statuscomputerworkflow den von den Receive-Aktivitäten implementierten Satz von Vorgängen in diesem Zustand annehmen. Dadurch können Protokolle auf Anwendungsebene erzwungen werden.
In der Datei "Web.config" werden die Bindungen für den Dienst definiert und zwei Endpunkte mit zwei unterschiedlichen Bindungen bereitgestellt: eine BasicHttpContextBinding mit aktivierten Cookies und die WSHttpContextBinding für Clients, die BasicHttpContextBinding nicht verwenden möchten. Mithilfe der WSHttpContextBinding kann der Kontext zum Weiterleiten von Anforderungen an die jeweilige Workflowinstanz beibehalten werden.
So richten Sie den Dienst in Internetinformationsdienste (IIS) ein
Führen Sie die in One-time Setup Procedure for Windows Communication Foundation Samples aufgelisteten Setupanweisungen aus.
Aktivieren Sie in IIS im virtuellen Verzeichnis ServiceModelSamples die Windows-Authentifizierung.
So aktivieren Sie die Windows-Authentifizierung in IIS 5.1 oder 6.0
- Öffnen Sie ein Eingabeaufforderungsfenster, und geben Sie start inetmgr ein, um das MMC-Snap-In Internetinformationsdienste (IIS) zu öffnen.
- Klicken Sie mit der rechten Maustaste auf das virtuelle Stammverzeichnis ServiceModelSamples in Standardwebsite, klicken Sie auf Eigenschaften, und klicken Sie dann auf die Registerkarte Verzeichnissicherheit.
- Klicken Sie unter Authentifizierung und Zugriffssteuerung auf Bearbeiten.
- Wählen Sie im Dialogfeld Authentifizierungsmethoden die Option Integrierte Windows-Authentifizierung aus.
So aktivieren Sie die Windows-Authentifizierung in IIS 7.0
- Öffnen Sie ein Eingabeaufforderungsfenster, und geben Sie start inetmgr ein, um das MMC-Snap-In Internetinformationsdienste (IIS) zu öffnen.
- Wählen Sie das virtuelle Stammverzeichnis ServiceModelSamples unter Standardwebsite aus.
- Doppelklicken Sie im Startbereich ServiceModelSamples in der Gruppe IIS auf Authentifizierung.
- Wählen Sie Windows-Authentifizierung aus, und wählen Sie die Aktion Aktivieren aus.
Erstellen Sie das Projekt. Das Projekt erstellt und aktualisiert ServiceModelSamples.
So lassen Sie Zugriff auf den permanenten Speicher zu
- Führen Sie das Skript CreateStores.cmd im Thema One-Time Setup Procedure for the Windows Communication Foundation Samples aus. In diesem Beispiel wird die Datenbank NetFx35Samples_ServiceWorkflowStore verwendet.
- Legen Sie das ASP.NET-Benutzerkonto als Member der SQL Server-Benutzergruppe fest.
Um sicherzustellen, dass der Dienst richtig installiert ist, zeigen Sie im Browser auf die Adresse https://localhost/ServiceModelSamples/service.svc. Es sollte die Hilfeseite für den Dienst angezeigt werden. Geben Sie zum Anzeigen der Web Services Descriptor Language (WSDL) https://localhost/ServiceModelSamples/service.svc?wsdl ein.
Zum Ausführen dieses Beispiels müssen Sie Beispiel für Rechnerclient verwenden. Dies ist eine mit Windows Presentation Foundation (WPF) erstellte Rechnerbenutzerschnittstelle, die als Client für den Dienst fungiert. Sie können andere Endpunkte verwenden, die den vom Dienst bereitgestellten Bindungen entsprechen. Klicken Sie zum Ändern der Bindungen auf das Menüelement Endpunkt, und wählen Sie die entsprechende Bindung aus (BasicHtttpContextBinding oder WSHttpContextBinding).
Damit Sie testen können, ob der Dienst permanent ist, schließen Sie den Client, und öffnen Sie ihn erneut, während der Rechnerclient ausgeführt wird. Der Rechnerclient kommuniziert mit der gleichen Dienstinstanz. Die Instanz-ID wird unten angezeigt. Der Rechnerclient verwendet die Textdatei Client.ctx zum Speichern des Kontexts an einem permanenten Speicherort, wenn der erste Aufruf ausgeführt wird (in diesem Beispiel im Verzeichnis \bin des Beispiels). Wenn Sie den Client erneut öffnen, überprüft er, ob die Datei vorhanden ist. Wenn die Textdatei vorhanden ist, wird der gespeicherte Kontext auf den Kanal angewendet, der erstellt wird. Wenn der Workflowdienst abgeschlossen wurde und Sie den Client öffnen, während sich die Datei "Client.ctx" noch im Verzeichnis "\bin" befindet, wird versucht, den Kontext auf den Kanal anzuwenden. Es wird ein Fehler angezeigt, da die Workflowinstanz, mit der kommuniziert werden soll, nicht vorhanden ist. Löschen Sie die Datei, und versuchen Sie es erneut.
Sie können den Workflowdienst auch wiederverwenden, indem Sie IIS neu starten. Da Sie nach jedem Vorgang einen Persistenzspeicher verwenden, wird der Zustand des Diensts gespeichert. Wenn Sie daher nach dem Neustart von IIS auf dem Client versuchen, mit dem Dienst zu kommunizieren, empfängt die Workflowinfrastruktur die Workflowinstanz vom Persistenzspeicher, und Sie können mit der gleichen Instanz kommunizieren.
Tipp
Wenn Sie einen Vorgang zum ersten Mal nach dem Neustart von IIS aufrufen, wird eine MessageSecurityException-Ausnahme ausgelöst. Dies wird durch ein abgelaufenes Sicherheitstoken im Kanal verursacht. Wenn Sie einen anderen Vorgang aufrufen, ist der Aufruf erfolgreich.