Freigeben über


Permanente Dienste

In diesem Beispiel wird das Erstellen eines permanenten Diensts durch Implementieren eines Rechners als permanenter Dienst veranschaulicht. Da der Dienst nach jedem Aufruf permanent ist, wird der Zustand des Diensts gespeichert. Wenn der Dienst wiederverwendet wird, kann der Zustand am letzten Persistenzpunkt wiederhergestellt werden. Daher ist ein Persistenzdienst erforderlich.

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 Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation. Sie müssen den Rechnerclient mit diesem Dienst ausführen. Weitere Informationen finden Sie unter den Verfahren zum Einrichten am Ende dieses Themas.

Im folgenden Codebeispiel wird der Dienstvertrag für den Rechnerdienst veranschaulicht.

[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 folgenden Code wird mit dem DurableServiceAttribute-Attribut in der Dienstimplementierung angegeben, dass es sich um einen permanenten Dienst handelt.

[Serializable]
[DurableServiceBehavior]
public class DurableCalculator : ICalculator
{
    int currentValue = default(int);

    [DurableOperationBehavior(CanCreateInstance=true)]
    public int PowerOn()
    {
        return currentValue;
    }

    [DurableOperationBehavior()]
    public int Add(int value)
    {
        return (currentValue += value);
    }

    [DurableOperationBehavior()]
    public int Subtract(int value)
    {
        return (currentValue -= value);
    }

    [DurableOperationBehavior()]
    public int Multiply(int value)
    {
        return (currentValue *= value);
    }

    [DurableOperationBehavior()]
    public int Divide(int value)
    {
        return (currentValue /= value);
    }

    [DurableOperationBehavior(CompletesInstance=true)]
    public void PowerOff()
    {
    }

}

Das DurableOperationAttribute-Attribut gibt an, dass der Dienstinstanzzustand gespeichert wird, nachdem der Vorgang abgeschlossen wurde.

Es gibt zwei Felder, die für das DurableOperationAttribute-Attribut angegeben werden können.

Die CanCreateInstance-Eigenschaft gibt an, dass die Instanz beim Aufrufen des Vorgangs erstellt wird. Damit CanCreateInstance richtig ausgeführt werden kann, muss es sich bei dem Vorgang, für den sie angegeben wird, um einen Anforderungs-/Antwortvorgang handeln. In diesem Beispiel wird der Kontext an den Client weitergeleitet, und die Dauerhaftigkeit wird durch die Möglichkeit des Clients erreicht, mit den Dienst zu kommunizieren. Bei einem unidirektionalen Vorgang wird der Kontext nicht an den Client weitergeleitet. Es muss daher eine andere Möglichkeit geben, um den Kontext an den Client zu übergeben, wenn eine lang andauernde und permanente Kommunikation mit der Dienstinstanz möglich sein soll.

Die CompletesInstance-Eigenschaft gibt an, dass die Instanz nach dem Abschließen des Vorgangs abgeschlossen wird, für den dies angegeben wurde. Der Zustand wird ebenfalls aus der Datenbank gelöscht, nachdem der Vorgang abgeschlossen wurde.

Im folgenden Code wird die SVC-Datei zum Hosten dieses Beispiels in Internetinformationsdienste (IIS) veranschaulicht.

<%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.DurableCalculator" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

Die Bindungen für den Dienst werden in der Datei "Web.config" konfiguriert. Es werden zwei Endpunkte mit unterschiedlichen Bindungen bereitgestellt: BasicHttpContextBinding mit aktivierten Cookies und die WSHttpContextBinding für Clients, die BasicHttpContextBinding nicht verwenden möchten. Mithilfe der WSHttpContextBinding-Bindung kann der Kontext zum Weiterleiten von Anforderungen an eine bestimmte permanente Dienstinstanz beibehalten werden. Der PersistenceProvider-Eintrag, der den Persistenz-Provider angibt, befindet sich im Abschnitt ServiceBehaviors.

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

  1. Informationen zum ordnungsgemäßen Einrichten dieses Beispiels mithilfe von Skripts finden Sie unter Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation.

  2. Aktivieren Sie in IIS im virtuellen Verzeichnis ServiceModelSamples die Windows-Authentifizierung.

    So aktivieren Sie die Windows-Authentifizierung in IIS 5.1 oder 6.0

    1. Öffnen Sie ein Eingabeaufforderungsfenster, und geben Sie start inetmgr ein, um das MMC-Snap-In Internetinformationsdienste (IIS) zu öffnen.
    2. 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.
    3. Klicken Sie unter Authentifizierung und Zugriffssteuerung auf Bearbeiten.
    4. Wählen Sie im Dialogfeld Authentifizierungsmethoden die Option Integrierte Windows-Authentifizierung aus.

    So aktivieren Sie die Windows-Authentifizierung in IIS 7.0

    1. Öffnen Sie ein Eingabeaufforderungsfenster, und geben Sie start inetmgr ein, um das MMC-Snap-In Internetinformationsdienste (IIS) zu öffnen.
    2. Wählen Sie das virtuelle Stammverzeichnis ServiceModelSamples unter Standardwebsite aus.
    3. Doppelklicken Sie im Startbereich ServiceModelSamples in der Gruppe IIS auf Authentifizierung.
    4. Wählen Sie Windows-Authentifizierung aus, und wählen Sie die Aktion Aktivieren aus.
  3. Erstellen Sie das Projekt. Das Projekt erstellt und aktualisiert ServiceModelSamples.

  4. So lassen Sie Zugriff auf den permanenten Speicher zu

    1. Führen Sie das Skript CreateStores.cmd im Thema Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation aus. In diesem Beispiel wird die Datenbank NetFx35Samples_DurableServiceStore verwendet.
    2. Legen Sie das ASP.NET-Benutzerkonto als Member der SQL Server-Benutzergruppe fest.
  5. Um sicherzustellen, dass der Dienst richtig installiert ist, zeigen Sie 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.

  6. 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 (BasicHttpContextBinding oder WSHttpContextBinding).

  7. 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 Datei vorhanden ist, wird der gespeicherte Kontext auf den Kanal angewendet, der erstellt wird. Wenn der permanente Dienst 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 permanente Dienstinstanz, mit der kommuniziert werden soll, nicht vorhanden ist. Löschen Sie die Datei, und versuchen Sie es erneut.

  8. Sie können den permanenten Dienst 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 permanente Dienstinstanz 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.

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