Freigeben über


Anhang A: Entwickeln der Auftragsanwendung

Dieser Anhang enthält detaillierte Schritte, anhand derer Entwickler den Contoso-Order Service erstellen können. Der Zweck dieses Anhangs besteht darin, Entwickler mit dem Entwickeln von Anwendungen in Visual Studio 2010 und dem .NET Framework 4, die Windows Communication Foundation (WCF)- und/oder WF (Windows Workflow Foundation)-Dienste enthalten, vertraut zu machen. Im Hauptteil dieses Lernprogramms wird diese Anwendung verwendet, um Systemadministratoren oder Besitzern von Anwendungen zu zeigen, wie Windows Server AppFabric zum Bereitstellen, Überwachen zur Problembehebung von Anwendungen verwendet wird, die WCF- und/oder WF-Dienste enthalten.

Der Contoso-Order Service setzt sich aus den folgenden vier Anwendungen zusammen:

  • Auftragsverarbeitungsdienst: Ein WCF-Dienst, der den Aufruf einer vorhandenen Auftragsverarbeitungsanwendung über die Webdienstschnittstelle simuliert.

  • Versanddienst: Ein WCF-Dienst, der den Aufruf einer vorhandenen Versandanwendung über APIs simuliert.

  • Workflowdienst für das Bestellwesen: Ein WF-Workflowdienst, der den Auftragsprozess einschließlich Auftragseingang, Auftragsverarbeitung und Versand verwaltet.

  • Auftragsclient: Eine Windows-Formularanwendung, die das Front-End für den Order Service darstellt.

Hinweis

Für den Anhang ist die Installation von Windows Server AppFabric nicht erforderlich. Zuerst müssen Sie jedoch die Dateien aus dem Lernprogramm zum Verwenden der Windows Server AppFabric-Oberfläche installieren, um die richtige Dateistruktur zu erstellen, die für das ordnungsgemäße Generieren des Anhangs erforderlich ist. Beachten Sie, dass Sie das Lernprogramm zum Verwenden der Windows Server AppFabric-Oberfläche für den Anhang nicht komplett durcharbeiten müssen – installieren Sie einfach die Dateien. Anweisungen zum Installationsvorgang des Lernprogramms zum Verwenden der Windows Server AppFabric-Oberfläche finden Sie in Lektion 1: Erste Schritte. Der Ordner C:\DublinTutorial\OrderServiceSolution\Completed enthält eine Kopie der fertig gestellten Projektmappe.

Verfahren

Die Erstellung der Anwendung erfordert die folgenden Schritte:

  1. Entwickeln des WCF-Diensts für die Auftragsverarbeitung

  2. Entwickeln des WCF-Diensts für den Versand

  3. Entwickeln des WF-Diensts für den Auftragsworkflow

  4. Fertigstellen des WCF-Diensts für die Auftragsverarbeitung

  5. Fertigstellen des WCF-Diensts für den Versand

  6. Entwickeln der Auftragsclientanwendung

  7. Packen von Order Service

Entwickeln des WCF-Diensts für die Auftragsverarbeitung

Die Auftragsverarbeitungsanwendung wurde von Contoso eingekauft. Sie umfasst Webdienste, mit denen andere Anwendungen kommunizieren können. Als Contoso-Entwickler müssen Sie einen WCF-Dienst mit Namen OrderProcessingService entwickeln, der mit der Auftragsverarbeitungsanwendung zusammenarbeitet.

So erstellen Sie eine Visual Studio-Projektmappe und eine WCF-Dienstanwendung für OrderProcessingService

  1. Klicken Sie auf Start, zeigen Sie auf Alle Programme, dann auf Microsoft Visual Studio 2010, und klicken Sie anschließend auf Microsoft Visual Studio 2010.

  2. Klicken Sie im Menü Datei auf Neu und dann auf Neues Projekt.

  3. Wählen Sie unter Neues Projekt die folgenden Werte aus, oder geben Sie sie ein, und klicken Sie dann auf OK.

    Eigenschaft Wert

    Projekttypen

    Visual C#/Web

    Vorlagen

    WCF-Dienstanwendung

    Name

    OrderProcessingService

    Speicherort

    C:\DublinTutorial\OrderServiceSolution

    Projektmappenname

    OrderService

    Projektmappenverzeichnis erstellen

    (aktiviert)

  4. Erweitern Sie in Projektmappen-Explorer den Eintrag OrderProcessingService, klicken Sie mit der rechten Maustaste auf IService1.cs, und klicken Sie dann auf Löschen.

  5. Klicken Sie auf OK, um das dauerhafte Löschen der Datei zu bestätigen.

  6. Erweitern Sie in Projektmappen-Explorer den Eintrag OrderProcessingService, klicken Sie mit der rechten Maustaste auf Service1.svc, und klicken Sie dann auf Löschen.

  7. Klicken Sie auf OK, um das dauerhafte Löschen der Datei zu bestätigen.

Die erste Aufgabe bei der Erstellung eines WCF-Diensts besteht darin, einen Vertrag zu definieren. Der Vertrag legt fest, welche Vorgänge der Dienst unterstützt. Ein Vorgang kann als eine Webdienstmethode betrachtet werden. Jede Methode auf der Oberfläche entspricht einem bestimmten Dienstvorgang. In OrderProcessingService definieren Sie zwei Methoden, ProcessOrder und CancelOrderProcess.

So definieren Sie den Dienstvertrag und den Datenvertrag für den Auftragsverarbeitungsdienst

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderProcessService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.

  2. Wählen Sie unter Neues Element hinzufügen - OrderProcessService die folgenden Werte aus, oder geben Sie sie ein, und klicken Sie dann auf Hinzufügen.

    Eigenschaft Wert

    Kategorien

    Visual C#/Web

    Vorlage

    WCF-Dienst

    Name

    OrderProcessing.svc

    Damit werden dem Projekt zwei Dateien hinzugefügt: IOrderProcessing.cs und OrderProcessing.svc.

  3. Doppelklicken Sie in Projektmappen-Explorer auf IOrderProcessing.cs, um die Datei zu öffnen.

  4. Klicken Sie mit der rechten Maustaste auf den Namespace OrderProcessingService, klicken Sie auf Umgestalten, und klicken Sie dann auf Umbenennen, um das Dialogfeld Umbenennen zu öffnen.

  5. Geben Sie im Feld Neuer Namen den Eintrag Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService ein, und klicken Sie dann auf OK.

  6. Klicken Sie auf Übernehmen, und klicken Sie dann auf Ja.

  7. Ändern Sie den Quellcode von OrderProcessing.svc so, dass er wie folgt aussieht:

    using System; 
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService
    {
        [ServiceContract]
        public interface IOrderProcessing
        {
            [OperationContract]
            string ProcessOrder(PurchaseOrder po);
    
            [OperationContract]
            string CancelOrderProcess(string orderID);
        }
    
        [DataContract]
        public class PurchaseOrder
        {
            [DataMember]
            public string POID;
            [DataMember]
            public string FirstName;
            [DataMember]
            public string LastName;
            [DataMember]
            public string EmailAddress;
            [DataMember]
            public string TelephoneNumber;
            [DataMember]
            public string AddressLine1;
            [DataMember]
            public string AddressLine2;
            [DataMember]
            public string City;
            [DataMember]
            public string State;
            [DataMember]
            public string ZipCode;
            [DataMember]
            public string Description;
            [DataMember]
            public int Quantity;
            [DataMember]
            public string UnitPrice;
        }
    }
    

    In dieser Datei definieren Sie die Datenverträge und die Dienstverträge. Clients können den Dienst aufrufen, um einen Auftrag zu verarbeiten und um die Auftragsverarbeitung abzubrechen.

Nachdem Sie die Verträge erstellt haben, die mithilfe einer Schnittstelle definiert werden, besteht der nächste Schritt darin, die Schnittstelle zu implementieren. Hierzu muss eine Klasse mit Namen OrderProcessService erstellt werden, die die benutzerdefinierte Schnittstelle IOrderProcessing implementiert.

So implementieren Sie den Vertrag für den Auftragsverarbeitungsdienst

  1. Doppelklicken Sie in Projektmappen-Explorer auf IOrderProcessing.cs, um die Datei zu öffnen.

  2. Ändern Sie den Quellcode so, dass er wie folgt aussieht:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    using System.Threading;
    using System.IO;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService
    {
        class WorkItem
        {
            private Thread workThread;
            private object workItemLock;
            private bool completeFlag;
    
            public Thread WorkThread { get { return workThread; } set { workThread = value; } }
            public object WorkItemLock { get { return workItemLock; } }
            public bool CompleteFlag { get { return completeFlag; } }
    
            public WorkItem(Thread WorkThread)
            {
                workThread = WorkThread;
                workItemLock = new object();
                completeFlag = false;
            }
    
            public void Complete()
            {
                completeFlag = true;
            }
        }
    
        public class OrderProcessing : IOrderProcessing
        {
            private static Dictionary<String, WorkItem> WorkItemMap = new Dictionary<String, WorkItem>();
    
            public string ProcessOrder(PurchaseOrder po)
            {
                //run the code from a different thread to simulate asynchronized call
                ThreadPool.QueueUserWorkItem(SendProcessResult, po);
                return ("The request for processing order[" + po.POID + "] has been received.");
            }
    
            private void SendProcessResult(object state)
            {
                PurchaseOrder po = (PurchaseOrder)state;
    
                WorkItem workItem = new WorkItem(Thread.CurrentThread);
                WorkItemMap.Add(po.POID, workItem);
    
                //Simulating the order processing process
                Thread.Sleep(120000);
    
                //The following code will be uncommented later in the process
                //OrderWorkflowService.ProcessServiceResult reply = new OrderWorkflowService.ProcessServiceResult();
                //reply.POID = po.POID;
                //reply.Message = "The order has been processed successfully.";
    
                //lock (workItem.WorkItemLock)
                //{
                //    using (OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient())
                //    {
                //        client.SubmitProcessResult(reply);
                //    }
    
                //    workItem.Complete();
                //    WorkItemMap.Remove(po.POID);
                //}
    
            }
    
            public string CancelOrderProcess(string poID)
            {
                string ret = "Cancel unavailable for this order.";
    
                //=====================================================//
                //===[ Attempt to get a work item for the order Id 
                //=====================================================//
                WorkItem workItem;
                if (WorkItemMap.TryGetValue(poID, out workItem) == true)
                {
                    //===========================================================
                    //=== Slight race condition here. Workitem could complete
                    //=== before we aquire its lock. So we check the          
                    //=== completion flag inside the lock.                    
                    //===========================================================
                    lock (workItem.WorkItemLock)
                    {
                        if ((!workItem.CompleteFlag) && (workItem.WorkThread.IsAlive))
                        {
                            workItem.WorkThread.Abort();
                            WorkItemMap.Remove(poID);
                            ret = "The order process has been terminated successfully.";
                        }
                    }
                }
                return ret;
            }
        }
    }
    

Eine Konfigurationsdatei gibt Ihnen die Flexibilität, zum Zeitpunkt der Bereitstellung anstatt zur Entwurfszeit Daten zu den Endpunkten und zum Dienstverhalten bereitzustellen. In dieser Konfigurationsdatei definieren Sie zwei Endpunkte.

So konfigurieren Sie den Auftragsverarbeitungsdienst mithilfe einer Konfigurationsdatei

  1. Erweitern Sie in Projektmappen-Explorer den Eintrag OrderProcessingService, und doppelklicken Sie dann auf Web.config, um die Datei zu öffnen. Fügen Sie im Tag <system.serviceModel> ein <service>-Tag hinzu:

        <services>
          <service name="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.OrderProcessing">
            <endpoint address="" binding="basicHttpBinding" contract="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.IOrderProcessing" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
    

So kompilieren Sie den WCF-Auftragsverarbeitungsdienst

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderProcessingService, und klicken Sie dann auf Neu erstellen. Vergewissern Sie sich im Ausgabefenster, dass das Projekt erfolgreich kompiliert wurde.

So testen Sie den WCF-Auftragsverarbeitungsdienst

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderProcessingService, und klicken Sie dann auf In Browser anzeigen. Damit wird ein Internet Explorer-Fenster geöffnet, in dem die Verzeichnisdateien aufgeführt werden.

  2. Klicken Sie im Internet Explorer-Fenster auf OrderProcessing.svc. Vergewissern Sie sich, dass keine Fehler ausgegeben werden.

Entwickeln des WCF-Diensts für den Versand

Der Versanddienst ist ein WCF-Dienst, der einen SQL Server-Speicher aufruft. In der Simulation erfolgt nicht wirklich ein Datenbankaufruf.

So fügen Sie dem Projekt das neue WCF-Dienstanwendungsprojekt hinzu

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Projekt.

  2. Wählen Sie unter Neues Projekt hinzufügen die folgenden Werte aus, oder geben Sie sie ein, und klicken Sie dann auf OK.

    Eigenschaft Wert

    Projekttypen

    Visual C#/Web

    Vorlagen

    WCF-Dienstanwendung

    Name

    ShippingService

    Speicherort

    C:\DublinTutorial\OrderServiceSolution\OrderService

  3. Erweitern Sie in Projektmappen-Explorer den Eintrag ShippingService, klicken Sie mit der rechten Maustaste auf IService1.cs, und klicken Sie dann auf Löschen.

  4. Klicken Sie auf OK, um das dauerhafte Löschen der Datei zu bestätigen.

  5. Erweitern Sie in Projektmappen-Explorer den Eintrag ShippingService, klicken Sie mit der rechten Maustaste auf Service1.svc, und klicken Sie dann auf Löschen.

  6. Klicken Sie auf OK, um das dauerhafte Löschen der Datei zu bestätigen.

Sie definieren einen Dienstvertrag mit Namen IShipping, der zwei Vorgangsverträge, ShipOrder und CancelShipping enthält.

So definieren Sie den Vertrag für den WCF-Versanddienst

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf ShippingService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.

  2. Wählen Sie unter Neues Element hinzufügen - ShippingService die folgenden Werte aus, oder geben Sie sie ein, und klicken Sie dann auf Hinzufügen.

    Eigenschaft Wert

    Kategorien

    Visual C#/Web

    Vorlage

    WCF-Dienst

    Name

    Shipping.svc

    Dem Projekt werden zwei Dateien hinzugefügt, IShipping.cs und Shipping.svc.

  3. Doppelklicken Sie in Projektmappen-Explorer auf IShipping.cs, um die Datei zu öffnen.

  4. Klicken Sie mit der rechten Maustaste auf den Namespace ShippingService, klicken Sie auf Umgestalten, und klicken Sie dann auf Umbenennen, um das Dialogfeld Umbenennen zu öffnen.

  5. Geben Sie im Feld Neuer Namen den Eintrag Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService ein, und klicken Sie dann auf OK.

  6. Klicken Sie auf Übernehmen, und klicken Sie dann auf Ja.

  7. Ändern Sie den Quellcode so, dass er wie folgt aussieht:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService
    {
        [ServiceContract]
        public interface IShipping
        {
            [OperationContract]
            string ShipOrder(string poID);
    
            [OperationContract]
            string CancelShipping(string poID);
        }
    }
    

So implementieren Sie den Vertrag für den WCF-Versanddienst

  1. Doppelklicken Sie in Projektmappen-Explorer auf Shipping.svc, um die Datei zu öffnen.

  2. Ändern Sie den Quellcode so, dass er wie folgt aussieht:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    using System.Threading;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService
    {
        class WorkItem
        {
            private Thread workThread;
            private object workItemLock;
            private bool completeFlag;
    
            public Thread WorkThread { get { return workThread; } set { workThread = value; } }
            public object WorkItemLock { get { return workItemLock; } }
            public bool CompleteFlag { get { return completeFlag; } }
    
            public WorkItem(Thread WorkThread)
            {
                workThread = WorkThread;
                workItemLock = new object();
                completeFlag = false;
            }
    
            public void Complete()
            {
                completeFlag = true;
            }
        }
    
        public class Shipping : IShipping
        {
            private static Dictionary<String, WorkItem> WorkItemMap = new Dictionary<String, WorkItem>();
    
            public string ShipOrder(string poID)
            {
                //run the code from a different thread to simulate asynchronized call
                ThreadPool.QueueUserWorkItem(SendShippingResult, poID);
                return ("The request for processing order[" + poID + "] has been received.");
            }
    
            private void SendShippingResult(object state)
            {
                string poID = state.ToString();
    
                WorkItem workItem = new WorkItem(Thread.CurrentThread);
                WorkItemMap.Add(poID, workItem);
    
                //Simulating the order processing process
                Thread.Sleep(60000);
    
                //The following portion will be uncommented after referencing OrderWorkflowService
                //OrderWorkflowService.ShippingServiceResult reply = new OrderWorkflowService.ShippingServiceResult();
                //reply.POID = poID;
                //reply.Message = "The order has been shipped.";
    
                //lock (workItem.WorkItemLock)
                //{
                //    using (OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient())
                //    {
                //        client.SubmitShippingResult(reply);
                //    }
    
                //    workItem.Complete();
                //    WorkItemMap.Remove(poID);
                //}
            }
    
            public string CancelShipping(string poID)
            {
                string ret = "Cancel unavailable for this order.";
    
                //=====================================================//
                //===[ Attempt to get a work item for the order Id 
                //=====================================================//
                WorkItem workItem;
                if (WorkItemMap.TryGetValue(poID, out workItem) == true)
                {
                    //===========================================================
                    //=== Slight race condition here. Workitem could complete
                    //=== before we aquire its lock. So we check the          
                    //=== completion flag inside the lock.                    
                    //===========================================================
                    lock (workItem.WorkItemLock)
                    {
                        if ((!workItem.CompleteFlag) && (workItem.WorkThread.IsAlive))
                        {
                            workItem.WorkThread.Abort();
                            WorkItemMap.Remove(poID);
                            ret = "The shipping process has been terminated successfully.";
                        }
                    }
                }
                return ret;
            }
        }
    }
    

In dieser Konfigurationsdatei definieren Sie zwei Endpunkte.

So konfigurieren Sie den WCF-Versanddienst mithilfe einer Konfigurationsdatei

  1. Erweitern Sie in Projektmappen-Explorer den Eintrag ShippingService, und doppelklicken Sie dann auf Web.config, um die Datei zu öffnen. Fügen Sie im Tag <system.serviceModel> ein <service>-Tag hinzu:

        <services>
          <service name="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.Shipping">
            <endpoint address="" binding="basicHttpBinding" contract="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.IShipping" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
    

So kompilieren Sie den WCF-Versanddienst

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt ShippingService, und klicken Sie dann auf Neu erstellen. Vergewissern Sie sich im Ausgabefenster, dass das Projekt erfolgreich kompiliert wurde.

Entwickeln des WF-Diensts für den Auftragsworkflow

Die Dienstanwendung für den Auftragsworkflow ist der wichtigste Bestandteil des gesamten Diensts. Hiermit wird der gesamte Geschäftsprozess orchestriert. Nachdem eine Bestellung eingegangen ist, ruft der Dienst OrderProcessingService und ShippingService auf. Anschließend sendet er eine E-Mail-Nachricht mit dem Bestellstatus an den Kunden.

So fügen Sie dem Projekt ein neues WCF-Workflowdienstanwendungs-Projekt hinzu

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Projekt.

  2. Wählen Sie unter Neues Projekt hinzufügen die folgenden Werte aus, oder geben Sie sie ein, und klicken Sie dann auf OK.

    Eigenschaft Wert

    Projekttypen

    Visual C#/Workflow

    Vorlagen

    WCF-Workflowdienstanwendung

    Name

    OrderWorkflowService

    Speicherort

    C:\DublinTutorial\OrderServiceSolution\OrderService

OrderWorkflowService verwendet OrderProcessingService und ShippingService. Daher müssen Sie auf die beiden Dienste erweisen.

So fügen Sie Dienstverweise hinzu

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderWorkflowService, und klicken Sie dann auf Dienstverweis hinzufügen.

  2. Klicken Sie unter Dienstverweis hinzufügen auf Ermitteln. Visual Studio sollte nun beide Dienste ermitteln.

  3. Geben Sie die folgenden Werte ein, bzw. wählen Sie sie aus, und klicken Sie dann auf OK, um den Dienstverweis zu erstellen.

    Eigenschaft Wert

    Dienste

    OrderProcessing.svc

    Namespace

    OrderProcessService

  4. Wiederholen Sie die Schritte für den anderen Dienstverweis mit den folgenden Werten:

    Eigenschaft Wert

    Dienste

    Shipping

    Namespace

    ShippingService

Sie müssen eine benutzerdefinierte Workflowaktivität definieren, mit der das Senden von E-Mail-Benachrichtigungen simuliert wird.

So erstellen Sie eine Workflowcodeaktivität

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderWorkflowService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.

  2. Wählen Sie unter Neues Element hinzufügen - OrderWorkflowService die folgenden Werte aus, oder geben Sie sie ein, und klicken Sie dann auf Hinzufügen.

    Eigenschaft Wert

    Kategorien

    Visual C#/Workflow

    Vorlage

    Aktivität Code

    Name

    SendNotification.cs

  3. Doppelklicken Sie in Projektmappen-Explorer auf SendNotification.cs, um die Datei zu öffnen.

  4. Klicken Sie mit der rechten Maustaste auf den Namespace OrderWorkflowService, klicken Sie auf Umgestalten, und klicken Sie dann auf Umbenennen, um das Dialogfeld Umbenennen zu öffnen.

  5. Geben Sie im Feld Neuer Namen den Eintrag Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService ein, und klicken Sie dann auf OK.

  6. Klicken Sie auf Übernehmen, und klicken Sie dann auf Ja.

  7. Ändern Sie den Quellcode so, dass er wie folgt aussieht:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Activities;
    using System.IO;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
    {
        public class SendNotification : CodeActivity
        {
            InArgument<string> to;
            InArgument<string> subject;
            InArgument<string> body;
            string pathRoot = @"C:\DublinTutorial\Inbox\";
    
            public InArgument<string> To { get { return this.to; } set { this.to = value; } }
            public InArgument<string> Subject { get { return this.subject; } set { this.subject = value; } }
            public InArgument<string> Body { get { return this.body; } set { this.body = value; } }
            public SendNotification() { }
    
            public SendNotification(InArgument<string> To, InArgument<string> Subject, InArgument<string> Body)
            {
                this.to = To; this.subject = Subject; this.body = Body;
            }
    
            protected override void Execute(CodeActivityContext context)
            {
                string filename;
                string content;
    
                try
                {
                    filename = this.to.Get<String>(context) + "~~" + this.subject.Get<string>(context) + "_" + DateTime.Now.ToFileTime() + ".txt";
                    content = String.Format("To: {0}" + Environment.NewLine
                        + "From: {1}" + Environment.NewLine
                        + "Subject: {2}" + Environment.NewLine
                        + Environment.NewLine
                        + "{3}",
                        this.to.Get<String>(context), "CustomerRelations@Contoso.com", this.subject.Get<String>(context), this.body.Get<String>(context));
    
                    File.WriteAllText((pathRoot + filename), content);
                }
                catch (Exception Ex)
                {
                    context.SetValue(Body, Ex.Message);
                }
    
            }
        }
    }
    

    Beachten Sie, dass der Pfad fest als C:\DublinTutorial\Inbox\ codiert ist.

Im folgenden Verfahren werden die Datentypen definiert. Diese Datentypen werden für OrderProcessingService und ShippingService verwendet, um Ergebnisse an OrderWorkflowService zurücksenden zu können.

So definieren Sie Datentypen

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderWorkflowService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.

  2. Wählen Sie unter Neues Element hinzufügen - OrderWorkflowService die folgenden Werte aus, oder geben Sie sie ein, und klicken Sie dann auf Hinzufügen.

    Eigenschaft Wert

    Kategorien

    Visual C#/Code

    Vorlage

    Codedatei

    Name

    DataTypes.cs

  3. Doppelklicken Sie in Projektmappen-Explorer auf DataTypes.cs, um die Datei zu öffnen.

  4. Ändern Sie den Quellcode so, dass er wie folgt aussieht:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService
    {
        [DataContract]
        public class ProcessServiceResult
        {
            [DataMember]
            public string POID;
            [DataMember]
            public string Message;
        }
    
        [DataContract]
        public class ShippingServiceResult
        {
            [DataMember]
            public string POID;
            [DataMember]
            public string Message;
        }
    }
    
  5. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderWorkflowService, und klicken Sie dann auf Neu erstellen. Sie müssen das Projekt erstellen, damit vom Workflow aus, den Sie im folgenden Schritt entwickeln, auf die Aktivität Code zugegriffen werden kann. Mit der Kompilierung können auch die WCF-Dienstendpunkte, auf die verwiesen wird, für den Workflow offen gelegt werden.

Der nächste Schritt besteht darin, den Workflow zu definieren. Der Workflow umfasst mehrere Stadien. Sie beginnen mit der Definition der Status und definieren dann die Details der Status. Jeder Teil der Entwicklung kann die folgenden Schritte umfassen:

  1. Zusammenstellen des Workflows mithilfe von Aktivitäten

  2. Definieren von Variablen

  3. Konfigurieren der Aktivitäten

So definieren Sie den Workflow

  1. Erweitern Sie in Projektmappen-Explorer den Eintrag OrderWorkflowService, klicken Sie mit der rechten Maustaste auf Service1.xamlx, und klicken Sie dann auf Umbenennen. Benennen Sie die Datei in OrderWorkflow.xamlx um.

  2. Doppelklicken Sie in Projektmappen-Explorer auf OrderWorkflow.xamlx, um die Datei zu öffnen. Unter Sequential Service sind zwei Aktivitäten aufgeführt: einer mit der Bezeichnung ReceiveRequest und ein weiterer mit der Bezeichnung SendRequest.

  3. Klicken Sie mit der rechten Maustaste auf die Aktivität Sequential Service, und klicken Sie dann auf Löschen.

  4. Klicken Sie im Workflow auf Aktivität hier ablegen, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    configurationName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderWorkflow

    Name

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderWorkflow

  5. Klicken Sie links im Fenster auf Toolbox, um den Bereich Toolbox zu öffnen, und verankern Sie die Toolbox auf der linken Seite des Fensters.

  6. Ziehen Sie die folgenden Aktivitäten aus der Toolbox an die Stelle im Workflow, an der „Aktivität hier ablegen“ steht.

    Kategorie Aktivität Hinweis

    Flowchart

    Flowchart

    Die Aktivität Flowchart ist eine zusammengesetzte Aktivität, die standardmäßig einen Start enthält. In den folgenden Schritten fügen Sie dieser Aktivität weitere Aktivitäten hinzu.

  7. Ziehen Sie die folgenden Aktivitäten in der angegebenen Reihenfolge aus der Toolbox in den Workflow:

    Kategorie Aktivität Hinweis

    Messaging

    ReceiveAndSendReply

    Dies ist der Status „Warten auf Auftrag“.

    Ablaufsteuerung

    Sequence

    Hierin ist der zweite Status „Auftrag geöffnet“ enthalten.

    Flowchart

    FlowDecision

    Die Aktivität FlowDecision hilft beim Übergang zwischen Status.

    Ablaufsteuerung

    Sequence

    Hierin ist der dritte Status „Auftrag verarbeitet“ enthalten.

    Flowchart

    FlowDecision

    Die Aktivität FlowDecision hilft beim Übergang zwischen Status.

    Ablaufsteuerung

    Sequence

    Hierin ist der letzte Status „Auftrag abgeschlossen“ enthalten.

  8. Verbinden Sie die Aktivitäten mit dem Mauszeiger, so dass sie wie folgt aussehen:

    67e7c9dd-77e7-43be-ad5a-797b3b46f6e8

  9. Klicken Sie am Fuß des Workflows auf Variablen, um den Bereich Variablen zu öffnen.

  10. Klicken Sie im Bereich Variablen auf Variable erstellen, und erstellen Sie dann die folgenden Variablen:

    Variablenname Variablentyp Bereich Hinweis

    poID

    String

    Flowchart

    poID ist eine GUID-Nummer. poID wird zudem für die Korrelation verwendet.

    isProcessed

    Boolean

    Flowchart

    Hierbei handelt es sich um ein Flag, das angibt, ob ein Auftrag erfolgreich verarbeitet wurde.

    isShipped

    Boolean

    Flowchart

    Hierbei handelt es sich um ein Flag, das angibt, ob ein Auftrag versendet wurde.

    isUpdated

    Boolean

    Flowchart

    Hierbei handelt es sich um ein Flag, das angibt, ob ein Auftrag von einem Kunden aktualisiert wurde.

    po

    PurchaseOrder

    Flowchart

    Dies ist ein benutzerdefinierter Datentyp, der in OrderProcessingService definiert wird. Er enthält Bestellinformationen.

    poUpdate

    PurchaseOrder

    Flowchart

    Diese Variable enthält die aktualisierten Bestellinformationen, wenn der Kunde die Bestellung aktualisieren möchte.

    correlationorderWorkflow

    CorrelationHandle

    Flowchart

    Dies ist das Korrelationshandle, das verwendet wird, um sowohl den Client mit dem Dienst, als auch den Dienst mit OrderProcessService und ShippingService zu verbinden.

    Nachstehend ein Screenshot der erstellten Variablen:

    9208977f-710c-460f-afd8-5c6bd8a792d9

  11. Klicken Sie im Workflow auf die Aktivität Flowchart, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Order Service

  12. Klicken Sie im Workflow auf die erste Sequence-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Warten auf Auftrag

  13. Klicken Sie im Workflow auf die zweite Sequence-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auftrag geöffnet

  14. Klicken Sie im Workflow auf die dritte Sequence-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auftrag verarbeitet

  15. Klicken Sie im Workflow auf die vierte Sequence-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auftrag abgeschlossen

  16. Klicken Sie im Workflow auf die erste FlowDecision-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Condition

    isProcessed

    FalseLabel

    Updated

    TrueLabel

    Processed

  17. Klicken Sie im Workflow auf die zweite FlowDecision-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Condition

    isShipped

    FalseLabel

    Updated

    TrueLabel

    Shipped

    Damit haben Sie die Hauptstruktur des Statuscomputerworkflows definiert. Nun werden die einzelnen Status definiert.

  18. Doppelklicken Sie im Workflow auf Warten auf Auftrag. Der Pfad wird unterhalb der Registerkarte angezeigt. Sie können auf Order Service klicken, um zurück zu der Seite zu gelangen, auf der der gesamte Statuscomputerworkflow angezeigt wird.

  19. Ziehen Sie die folgenden Aktivitäten in der angegebenen Reihenfolge aus der Toolbox in den Workflow:

    Kategorie Aktivität Hinweis

    Primitive

    Assign

    Mit dieser Assign-Aktivität wird für den Auftrag eine Auftrags-ID (GUID) abgerufen.

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

    Mit dieser benutzerdefinierten Aktivität wird eine E-Mail-Benachrichtigung an den Kunden gesendet.

    Primitive

    Assign

    Diese Assign-Aktivität wird verwendet, damit das bestellte Produkt überwacht werden kann.

    Primitive

    Assign

    Diese Assign-Aktivität wird verwendet, damit die Bestellmenge überwacht werden kann.

  20. Ordnen Sie die Aktivitäten wie folgt neu an:

    Warten auf Bestellungsstatusaktivitäten

  21. Klicken Sie am Fuß des Workflows auf Variablen, um den Bereich Variablen zu öffnen.

  22. Klicken Sie im Bereich Variablen auf Variable erstellen, und erstellen Sie dann die folgenden Variablen:

    Variablenname Variablentyp Bereich Hinweis

    Produkt

    String

    Warten auf Auftrag

    AppFabric kann Workflowvariablen nachverfolgen. Diese Variable wird erstellt, damit der Produktname nachverfolgt werden kann.

    Menge

    Int32

    Warten auf Auftrag

    Diese Variable dient zur Nachverfolgung.

  23. Klicken Sie im Workflow auf die Receive-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data: po; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.Purchaseorder

    DisplayName

    Bestellung empfangen

    OperationName

    SubmitPO

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (aktiviert)

  24. Klicken Sie im Workflow auf die erste Assign-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Bestell-ID

    zu

    po.POID zuweisen

    Wert

    System.Guid.NewGuid().ToString()

  25. Klicken Sie im Workflow auf die SendReplyToReceive-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data: po.POID; Message type: string

    CorrelationInitializers

    CorrelationOrderWorkflow;Query correlation initialize; key1=sm:body()/xg0:string

    237be300-a94d-4b8e-a707-83f4d2041f6e

    Hinweis

    Sie haben soeben eine Korrelation vorgenommen. In diesem Workflow gibt es sieben Receive-Aktivitäten: eine zum Empfangen der Bestellung, eine zum Empfangen des Verarbeitungsdienstergebnisses, eine zum Empfangen des Vesanddienstergebnisses, zwei zum Empfangen von Kundenaktualisierungen und zwei zum Empfangen von Kundenstornierungen. Nach dem Eingang der Bestellung generiert der Workflowdienst eine GUID-Nummer als Auftragsnummer. Nehmen wir an, dass der Workflowdienst viele Bestellungen gleichzeitig entgegennimmt. Das Workflowmodul erstellt eine Workflowinstanz für jede der Bestellanforderungen. Das Workflowmodul muss nun die anderen sechs Anforderungen den Workflowinstanzen zuordnen (oder korrelieren). Hierfür benötigt das Workflowmodul eine eindeutige Kennung für jede Korrelation. In diesem Beispiel ist die Auftragsnummer (GUID) die eindeutige Kennung. In der ersten SendReplyToReceive-Aktivität definieren Sie einen CorrelationInitializer. Sie wählen den Abfragetyp Query Correlation Initializer aus, was bedeutet, dass sich die eindeutige Kennung in der Nachricht befindet, die an die Receive-Aktivität übergeben wird. Darüber hinaus geben Sie den xPath zu dem Feld an. Neben der Korrelationsinitialisierung müssen Sie im Feld CorrelateWith auch ein Korrelationshandle angeben. Ein Korrelationshandle ist ein Container für die Korrelationsdaten, damit die Korrelationsdaten überall im Workflow abgerufen werden können. In den nachfolgenden Receive-Aktivitäten geben Sie das gleiche Korrelationshandle an. In den Feldern CorrelateOn geben Sie an, wie die Auftragsnummer für die empfangene Nachricht abgerufen werden soll.

  26. Klicken Sie im Workflow auf die Aktivität SendNotification, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "We have received your order.  Your order number is " + po.POID

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Received"

    An

    po.EmailAddress

  27. Klicken Sie im Workflow auf die zweite Assign-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Produktname

    zu

    Produkt zuweisen

    Wert

    po.Description

  28. Klicken Sie im Workflow auf die dritte Assign-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Menge

    zu

    Menge zuweisen

    Wert

    po.Quantity

    Damit haben Sie die Implementierung des Status „Warten auf Auftrag“ abgeschlossen.

  29. Klicken Sie unter dem Registerkartennamen auf Order Service, um die Flowchart-Aktivität „Order Service“ anzuzeigen.

  30. Doppelklicken Sie im Workflow auf die Sequence-Aktivität Auftrag geöffnet, um den Status zu implementieren.

  31. Ziehen Sie die folgenden Aktivitäten in der angegebenen Reihenfolge aus der Toolbox in den Workflow:

    Kategorie Aktivität Hinweis

    Primitive

    Assign

    Ablaufsteuerung

    Parallel

  32. Ziehen Sie die folgende Aktivität in die Parallel-Aktivität:

    Kategorie Aktivität Hinweis

    Ablaufsteuerung

    Sequence

  33. Ziehen Sie die folgende Aktivität in die Sequence-Aktivität:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.Activities

    ProcessOrder

    Laufzeit

    Persist

    Messaging

    Receive

    Microsoft.Samples.Dublin.Tutorials.OrderService.orderWorkflowService

    SendNotification

    Primitive

    Assign

  34. Ziehen Sie die folgende Aktivität in die Parallel-Aktivität und auf die rechte Seite der vorhandenen Sequence-Aktivität:

    Kategorie Aktivität Hinweis

    Messaging

    ReceiveAndSendReply

    Die Aktivität ReceiveAndSendReply ist eine zusammengesetzte Aktivität mit einer Sequence-Aktivität, die eine Receive-Aktivität und eine SendReplyToReceive-Aktivität einschließt.

  35. Ziehen Sie die folgenden Aktivitäten in die neu hinzugefügte Sequence-Aktivität und zwischen die beiden Receive- und SendReplyToReceive-Aktivitäten:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.Activities

    CancelOrderProcess

    Ablaufsteuerung

    If

  36. Ziehen Sie die folgende Aktivität in die Aktivität Then branch of the If:

    Kategorie Aktivität Hinweis

    Ablaufsteuerung

    Sequence

  37. Ziehen Sie die folgenden Aktivitäten in die neu hinzugefügte Sequence-Aktivität:

    Kategorie Aktivität Hinweis

    Primitive

    Assign

    Primitive

    Assign

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  38. Ziehen Sie die folgende Aktivität in die Aktivität Else branch of the If:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  39. Ziehen Sie die folgende Aktivität in die Parallel-Aktivität, um diese zum am weitesten rechts befindlichen Zweig zu machen:

    Kategorie Aktivität Hinweis

    Messaging

    ReceiveAndSendReply

  40. Ziehen Sie die folgenden Aktivitäten in die neu hinzugefügte Sequence-Aktivität und zwischen die beiden Receive- und SendReplyToReceive-Aktivitäten:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService.Activities

    CancelOrderProcess

    Ablaufsteuerung

    If

  41. Ziehen Sie die folgende Aktivität in die Aktivität Then branch of the If:

    Kategorie Aktivität Hinweis

    Ablaufsteuerung

    Sequence

  42. Ziehen Sie die folgenden Aktivitäten in die neu hinzugefügte Sequence-Aktivität:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

    Laufzeit

    TerminateWorkflow

  43. Ziehen Sie die folgende Aktivität in die Aktivität Else branch of the If:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

    Nachdem Sie die Aktivitäten hinzugefügt haben, sieht der Status „Auftrag geöffnet“ wie folgt aus:

    Auftragsstatus „Geöffnet“

  44. Klicken Sie auf die Sequence-Aktivität des ganz links befindlichen Zweigs der Parallel-Aktivität, und klicken Sie dann am Fuß des Workflows auf Variablen, um den Bereich Variablen zu öffnen.

  45. Klicken Sie im Bereich Variablen auf Variable erstellen, und erstellen Sie dann die folgenden Variablen:

    Variablenname Variablentyp Bereich Hinweis

    cancelOrderProcessAcknowledgement

    String

    Parallel

    ProcessServiceResult

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ProcessServiceResult

    Sequence

    processServiceAcknowledgement

    String

    Sequence

  46. Klicken Sie im Workflow auf die Assign-Aktivität ganz oben in der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    isUpdated

    auf

    isUpdated initialisieren

    Wert

    False

  47. Klicken Sie im Workflow auf die Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Completion

    isUpdated Or isProcessed

    DisplayName

    Auftrag verarbeiten

  48. Klicken Sie im Workflow auf die Sequence-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Verarbeiten

  49. Klicken Sie im Workflow auf die ProcessOrder-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auftrag verarbeiten

    po

    po

    ProcessOrderResult

    processServiceAcknowledgement

  50. Klicken Sie im Workflow auf die Receive-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data:processServiceResult; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ProcessServiceResult

    DisplayName

    Prozessergebnis empfangen

    OperationName

    SubmitProcessResult

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (deaktiviert)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:ProcessServiceResult/sg0:POID

    CorrelationWith

    correlationOrderWorkflow

  51. Klicken Sie im Workflow auf die SendNotification-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Order with order#" + po.POID + " has been processed, and is ready for shipping."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Processed"

    An

    po.EmailAddress
  52. Klicken Sie im Workflow auf die Assign-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    „isProcessed“-Flag festlegen

    auf

    „isProcessed“

    Wert

    True

    Damit haben Sie die Konfiguration des äußerst linken Zweigs der Parallel-Aktivität abgeschlossen.

  53. Klicken Sie im Workflow auf die Sequence-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auf Aktualisierung warten

  54. Klicken Sie im Workflow auf die Receive-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data:poUpdate; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.PurchaseOrder

    DisplayName

    Aktualisierung empfangen

    OperationName

    SubmitUpdate

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (deaktiviert)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:PurchaseOrder/xg0:POID

    CorrelationWith

    correlationOrderWorkflow

  55. Klicken Sie im Workflow auf die SendReplyToReceive-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data: “PO update received”; Message type: String

    DisplayName

    „Aktualisierung empfangen“ bestätigen

  56. Klicken Sie im Workflow auf die CancelOrderProcess-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    CancelOrderProcessResult

    cancelOrderProcessAcknowledgement

    DisplayName

    Auftragsverarbeitung abbrechen

    orderID

    po.POID
  57. Klicken Sie im Workflow auf die If-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Condition

    cancelOrderProcessAcknowledgement = "The order process has been terminated successfully."

    DisplayName

    Stornostatus prüfen

  58. Klicken Sie im Workflow auf die Sequence-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Storno erfolgreich-Sequenz

  59. Klicken Sie im Workflow auf die erste Assign-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Bestellung aktualisieren

    auf

    po

    Wert

    poUpdate
  60. Klicken Sie im Workflow auf die zweite Assign-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    „isUpdated“-Flag festlegen

    auf

    isUpdated

    Wert

    True
  61. Klicken Sie im Workflow auf die SendNotification-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Your order has updated upon your request. The order is under processing."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Updated (by customer)"

    An

    po.EmailAddress
  62. Klicken Sie im Workflow auf die SendNotification-Aktivität der Else branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Your order update request cannot be processed. Please try again."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Update (by customer) Failed"

    An

    po.EmailAddress

    Damit haben Sie die Konfiguration des mittleren Zweigs der Parallel-Aktivität abgeschlossen.

  63. Klicken Sie im Workflow auf die Sequence-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auf Stornierung warten

  64. Klicken Sie im Workflow auf die Receive-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data:poID; Message type:String

    DisplayName

    Stornierung empfangen

    OperationName

    SubmitCancellation

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (deaktiviert)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:string

    CorrelationWith

    correlationOrderWorkflow

  65. Klicken Sie im Workflow auf die SendReplyToReceive-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data: “PO cancellation received”; Message type: String

    DisplayName

    Empfang der Stornierung bestätigen

  66. Klicken Sie im Workflow auf die CancelOrderProcess-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    CancelOrderProcessResult

    cancelOrderProcessAcknowledgement

    DisplayName

    Auftragsverarbeitung abbrechen

    orderID

    po.POID
  67. Klicken Sie im Workflow auf die If-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Condition

    cancelOrderProcessAcknowledgement = "The order process has been terminated successfully."

    DisplayName

    Stornostatus prüfen

  68. Klicken Sie im Workflow auf die Sequence-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Storno erfolgreich-Sequenz

  69. Klicken Sie im Workflow auf die SendNotification-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Your order has been cancelled upon your request."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Cancelled (by customer)"

    An

    po.EmailAddress
  70. Klicken Sie im Workflow auf die TerminateWorkflow-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Workflow beenden

    Grund

    “Client cancellation”
  71. Klicken Sie im Workflow auf die zweite SendNotification-Aktivität der Else branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Your order cancellation request cannot be processed. Please try again."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Cancellation(by customer) Failed"

    An

    po.EmailAddress

    Damit haben Sie die Konfiguration des äußerst rechten Zweigs der Parallel-Aktivität abgeschlossen.

  72. Klicken Sie unter dem Registerkartennamen auf Order Service, um die Flowchart-Aktivität „Order Service“ anzuzeigen.

  73. Doppelklicken Sie im Workflow auf die Sequenzaktivität Auftrag verarbeitet, um den Status zu implementieren.

  74. Ziehen Sie die folgenden Aktivitäten in der angegebenen Reihenfolge aus der Toolbox in den Workflow:

    Kategorie Aktivität Hinweis

    Primitive

    Assign

    Ablaufsteuerung

    Parallel

  75. Ziehen Sie die folgende Aktivität in die Aktivität Parallel:

    Kategorie Aktivität Hinweis

    Ablaufsteuerung

    Sequence

  76. Ziehen Sie die folgende Aktivität in die Aktivität Sequence:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService.Activities

    ShipOrder

    Laufzeit

    Persist

    Messaging

    Receive

    Primitive

    Assign

  77. Ziehen Sie die folgende Aktivität in die Parallel-Aktivität und auf die rechte Seite der vorhandenen Sequence-Aktivität:

    Kategorie Aktivität Hinweis

    Messaging

    ReceiveAndSendReply

    Die Aktivität ReceiveAndSendReply ist eine zusammengesetzte Aktivität mit einer Sequence-Aktivität, die eine Receive-Aktivität und eine SendReplyToReceive-Aktivität einschließt.

  78. Ziehen Sie die folgenden Aktivitäten in die neu hinzugefügte Sequence-Aktivität und zwischen die beiden Receive- und SendReplyToReceive-Aktivitäten:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService.Activities

    CancelShipping

    Ablaufsteuerung

    If

  79. Ziehen Sie die folgende Aktivität in die Aktivität Then branch of the If:

    Kategorie Aktivität Hinweis

    Ablaufsteuerung

    Sequence

  80. Ziehen Sie die folgenden Aktivitäten in die neu hinzugefügte Sequence-Aktivität:

    Kategorie Aktivität Hinweis

    Primitive

    Assign

    Primitive

    Assign

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  81. Ziehen Sie die folgende Aktivität in die Aktivität Else branch of the If:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  82. Ziehen Sie die folgende Aktivität in die Parallel-Aktivität, um diese zum am weitesten rechts befindlichen Zweig zu machen:

    Kategorie Aktivität Hinweis

    Messaging

    ReceiveAndSendReply

  83. Ziehen Sie die folgenden Aktivitäten in die neu hinzugefügte Sequence-Aktivität und zwischen die beiden Receive- und SendReplyToReceive-Aktivitäten:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService.Activities

    CancelShipping

    Ablaufsteuerung

    If

  84. Ziehen Sie die folgende Aktivität in die Aktivität Then branch of the If:

    Kategorie Aktivität Hinweis

    Ablaufsteuerung

    Sequence

  85. Ziehen Sie die folgenden Aktivitäten in die neu hinzugefügte Sequence-Aktivität:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

    Laufzeit

    TerminateWorkflow

  86. Ziehen Sie die folgende Aktivität in die Aktivität Else branch of the If:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

    Nachdem Sie die Aktivitäten hinzugefügt haben, sieht der Status „Auftrag verarbeitet“ wie folgt aus:

    Auftragsstatus „Verarbeitet“

  87. Klicken Sie auf die Sequence-Aktivität des ganz links befindlichen Zweigs der Parallel-Aktivität, und klicken Sie dann am Fuß des Workflows auf Variablen, um den Bereich Variablen zu öffnen.

  88. Klicken Sie im Bereich Variablen auf Variable erstellen, und erstellen Sie dann die folgenden Variablen:

    Variablenname Variablentyp Bereich Hinweis

    cancelShippingAcknowledgement

    String

    Parallel

    ShippingServiceResult

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ShippingServiceResult

    Sequence

    shippingServiceAcknowledgement

    String

    Sequence

  89. Klicken Sie im Workflow auf die Assign-Aktivität ganz oben in der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    „isUpdated“

    auf

    „isUpdated“ initialisieren

    Wert

    False

  90. Klicken Sie im Workflow auf die Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Completion

    isUpdated Or isShipped

    DisplayName

    Auftrag versenden

  91. Klicken Sie im Workflow auf die Sequence-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Versand

  92. Klicken Sie im Workflow auf die ShipOrder-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auftrag versenden

    poID

    po.POID

    ShipOrderResult

    shippingServiceAcknowledgement

  93. Klicken Sie im Workflow auf die Receive-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data:shippingServiceResult; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.ShippingServiceResult

    DisplayName

    Versandergebnis empfangen

    OperationName

    SubmitShippingResult

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (deaktiviert)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:ShippingServiceResult/xg0:POID

    CorrelationWith

    correlationOrderWorkflow

  94. Klicken Sie im Workflow auf die Assign-Aktivität im ganz links befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    „isShipped“-Flag festlegen

    auf

    „isShipped“

    Wert

    True

    Damit haben Sie die Konfiguration des äußerst linken Zweigs der Parallel-Aktivität abgeschlossen.

  95. Klicken Sie im Workflow auf die Sequence-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auf Aktualisierung warten

  96. Klicken Sie im Workflow auf die Receive-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data:poUpdate; Message type: Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderProcessingService.PurchaseOrder

    DisplayName

    Aktualisierung empfangen

    OperationName

    SubmitUpdate

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (deaktiviert)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:PurchaseOrder/xg0:POID

    CorrelationWith

    correlationOrderWorkflow

  97. Klicken Sie im Workflow auf die SendReplyToReceive-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data: “PO update received”; Message type: String

    DisplayName

    „Aktualisierung empfangen“ bestätigen

  98. Klicken Sie im Workflow auf die CancelShipping-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    CancelShippingResult

    cancelShippingAcknowledgement

    DisplayName

    Versand abbrechen

    orderID

    poUpdate.POID
  99. Klicken Sie im Workflow auf die If-Aktivität im mittleren Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Condition

    cancelShippingAcknowledgement = "The shipping process has been terminated successfully."

    DisplayName

    Stornostatus prüfen

  100. Klicken Sie im Workflow auf die Sequence-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Storno erfolgreich-Sequenz

  101. Klicken Sie im Workflow auf die erste Assign-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Bestellung aktualisieren

    auf

    po

    Wert

    poUpdate
  102. Klicken Sie im Workflow auf die zweite Assign-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    „isUpdated“-Flag festlegen

    auf

    isUpdated

    Wert

    True
  103. Klicken Sie im Workflow auf die SendNotification-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Your order has updated upon your request. The order is under processing."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Updated (by customer)"

    An

    po.EmailAddress
  104. Klicken Sie im Workflow auf die SendNotification-Aktivität der Else branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Your order update request cannot be processed. The order has been shipped."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Update (by customer) Failed"

    An

    po.EmailAddress

    Damit haben Sie die Konfiguration des mittleren Zweigs der Parallel-Aktivität abgeschlossen.

  105. Klicken Sie im Workflow auf die Sequence-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Auf Stornierung warten

  106. Klicken Sie im Workflow auf die Receive-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data:poID; Message type:String

    DisplayName

    Stornierung empfangen

    OperationName

    SubmitCancellation

    ServiceContractName

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService

    CanCreateInstance

    (deaktiviert)

    CorrelationOn

    CorrelationWith: correlationOrderWorkflow; XPath Queries: key1=sm:body()/xg0:string

    CorrelationWith

    correlationOrderWorkflow

  107. Klicken Sie im Workflow auf die SendReplyToReceive-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Inhalt

    Message; Message data: “PO cancellation received”; Message type: String

    DisplayName

    Empfang der Stornierung bestätigen

  108. Klicken Sie im Workflow auf die CancelShipping-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    CancelshippingResult

    cancelShippingAcknowledgement

    DisplayName

    Versand abbrechen

    poID

    po.POID
  109. Klicken Sie im Workflow auf die If-Aktivität im ganz rechts befindlichen Zweig der Parallel-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Condition

    cancelShippingAcknowledgement = "The shipping process has been terminated successfully."

    DisplayName

    Stornostatus prüfen

  110. Klicken Sie im Workflow auf die Sequence-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Storno erfolgreich-Sequenz

  111. Klicken Sie im Workflow auf die SendNotification-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "We are sorry you chose to cancel your order. If there is anything we can do to help you with our order process or with our products or services please do not hesitate to contact us."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Cancelled (by cusotmer)"

    An

    po.EmailAddress
  112. Klicken Sie im Workflow auf die TerminateWorkflow-Aktivität der Then branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    DisplayName

    Workflow beenden

    Grund

    “Client cancellation”
  113. Klicken Sie im Workflow auf die zweite SendNotification-Aktivität der Else branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Your order cancellation request cannot be processed. The order has been shipped.

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~Order Cancellation(by customer) Failed"

    An

    po.EmailAddress

    Damit haben Sie die Konfiguration des äußerst rechten Zweigs der Parallel-Aktivität abgeschlossen.

  114. Klicken Sie unter dem Registerkartennamen auf Order Service, um die Flowchart-Aktivität „Order Service“ anzuzeigen.

  115. Doppelklicken Sie im Workflow auf die Sequence-Aktivität Auftrag abgeschlossen, um den Status zu implementieren.

  116. Ziehen Sie die folgenden Aktivitäten in der angegebenen Reihenfolge aus der Toolbox in den Workflow:

    Kategorie Aktivität Hinweis

    Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService

    SendNotification

  117. Klicken Sie im Workflow auf die zweite SendNotification-Aktivität der Else branch of the If-Aktivität, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Text

    "Your order has been shipped.  Thank you for shopping at contoso.com."

    DisplayName

    Benachrichtigung an Kunden senden

    Betreff

    "Contoso.com Order#" + po.POID + "~~ Order Shipped"

    An

    po.EmailAddress

    Damit haben Sie die Workflowentwicklung abgeschlossen.

In dieser Konfigurationsdatei definieren Sie zwei Endpunkte und ein Verhaltenselement.

So konfigurieren Sie den Auftragsworkflowdienst mithilfe einer Konfigurationsdatei

  1. Erweitern Sie in Projektmappen-Explorer den Eintrag OrderWorkflowService, und doppelklicken Sie dann auf Web.config, um die Datei zu öffnen.

  2. Fügen Sie im Tag <system.serviceModel> ein <service>-Tag hinzu.

        <services>
          <service name="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.OrderWorkflow">
            <endpoint address="" binding="basicHttpBinding" contract="Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService.IOrderWorkflowService" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
    

So kompilieren Sie den Auftragsworkflowdienst

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderWorkflowService, und klicken Sie dann auf Neu erstellen. Vergewissern Sie sich im Ausgabefenster, dass das Projekt erfolgreich kompiliert wurde.

Fertigstellen des Auftragsverarbeitungsdiensts

OrderProcessingService und OrderWorkflowService verweisen aufeinander. Daher muss OrderProcessingService nach der Fertigstellung von OrderWorkflowService fertig gestellt werden.

So fügen Sie Dienstverweise hinzu

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderProcessingService, und klicken Sie dann auf Dienstverweis hinzufügen.

  2. Klicken Sie unter Dienstverweis hinzufügen auf Ermitteln. Visual Studio sollte nun beide Dienste ermitteln.

  3. Geben Sie die folgenden Werte ein, bzw. wählen Sie sie aus, und klicken Sie dann auf OK, um den Dienstverweis zu erstellen.

    Eigenschaft Wert

    Dienste

    OrderWorkflow.xamlx

    Namespace

    OrderWorkflowService

So ändern Sie die Datei „OrderProcessing.svc“

  1. Erweitern Sie in Projektmappen-Explorer den Eintrag OrderProcessingService, und doppelklicken Sie dann auf OrderProcessing.svc, um die Datei zu öffnen.

  2. Heben Sie die Kommentierung des Abschnitts in der Funktion SendProcessResult auf, sodass die Funktion wie folgt aussieht:

    
    private void SendProcessResult(object state)
    {
        PurchaseOrder po = (PurchaseOrder)state;
    
        WorkItem workItem = new WorkItem(Thread.CurrentThread);
        WorkItemMap.Add(po.POID, workItem);
    
        //Simulating the order processing process
        Thread.Sleep(120000);
    
        //The following portion will be uncommented after referencing OrderWorkflowService
        OrderWorkflowService.ProcessServiceResult reply = new OrderWorkflowService.ProcessServiceResult();
        reply.POID = po.POID;
        reply.Message = "The order has been processed successfully.";
    
        lock (workItem.WorkItemLock)
        {
            using (OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient())
            {
                client.SubmitProcessResult(reply);
            }
    
            workItem.Complete();
            WorkItemMap.Remove(po.POID);
        }
    
    }
    

So kompilieren Sie den Auftragsverarbeitungsdienst

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderProcessingService, und klicken Sie dann auf Neu erstellen. Vergewissern Sie sich im Ausgabefenster, dass das Projekt erfolgreich kompiliert wurde.

Fertigstellen des Versanddiensts

ShippingService und OrderWorkflowService verweisen aufeinander. Daher muss ShippingService nach der Fertigstellung von OrderWorkflowService fertig gestellt werden.

So fügen Sie Dienstverweise hinzu

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf ShippingService, und klicken Sie dann auf Dienstverweis hinzufügen.

  2. Klicken Sie unter Dienstverweis hinzufügen auf Ermitteln. Visual Studio sollte nun beide Dienste ermitteln.

  3. Geben Sie die folgenden Werte ein, bzw. wählen Sie sie aus, und klicken Sie dann auf OK, um den Dienstverweis zu erstellen.

    Eigenschaft Wert

    Dienste

    OrderWorkflow.xamlx

    Namespace

    OrderWorkflowService

So ändern Sie „Shipping.svc“

  1. Erweitern Sie in Projektmappen-Explorer den Eintrag ShippingService, und doppelklicken Sie dann auf Shipping.svc, um die Datei zu öffnen.

  2. Heben Sie die Kommentierung des Abschnitts in der Funktion SendShippingResult auf, sodass die Funktion wie folgt aussieht:

    private void SendShippingResult(object state)
    {
        string poID = state.ToString();
    
        WorkItem workItem = new WorkItem(Thread.CurrentThread);
        WorkItemMap.Add(poID, workItem);
    
        //Simulating the order processing process
        Thread.Sleep(60000);
    
        //The following portion will be uncommented after referencing OrderWorkflowService
        OrderWorkflowService.ShippingServiceResult reply = new OrderWorkflowService.ShippingServiceResult();
        reply.POID = poID;
        reply.Message = "The order has been shipped.";
    
        lock (workItem.WorkItemLock)
        {
            using (OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient())
            {
                client.SubmitShippingResult(reply);
            }
    
            workItem.Complete();
            WorkItemMap.Remove(poID);
        }
    }
    

So kompilieren Sie den Versanddienst

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt ShippingService, und klicken Sie dann auf Neu erstellen. Vergewissern Sie sich im Ausgabefenster, dass das Projekt erfolgreich kompiliert wurde.

Entwickeln der Auftragsclientanwendung

In diesem Schritt entwickeln Sie eine Windows-Formularclientanwendung.

So fügen Sie dem Projekt ein Windows-Formularwendungsprojekt hinzu

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Projekt.

  2. Wählen Sie unter Neues Projekt hinzufügen die folgenden Werte aus, oder geben Sie sie ein, und klicken Sie dann auf OK.

    Eigenschaft Wert

    Projekttypen

    Visual C#/Windows

    Vorlagen

    Windows-Formularanwendung

    Name

    OrderClient

    Speicherort

    C:\DublinTutorial\OrderServiceSolution\OrderService

Die Auftragsclient dient als Schnittstelle für den Workflowdienst. Sie dem Workflowdienst daher einen Dienstverweis hinzufügen.

So fügen Sie den Dienstverweis hinzu

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderClient, und klicken Sie dann auf Dienstverweis hinzufügen, um das Dialogfeld Dienstverweis hinzufügen zu öffnen.

  2. Klicken Sie unter Dienstverweis hinzufügen auf Ermitteln.

  3. Geben Sie die folgenden Werte ein, bzw. wählen Sie sie aus, und klicken Sie dann auf OK, um den Dienstverweis zu erstellen.

    Eigenschaft Wert

    Dienste

    OrderWorkflow.xamlx

    Namespace

    OrderWorkflowService

So entwickeln Sie das Windows-Formular

  1. Erweitern Sie in Projektmappen-Explorer den Eintrag OrderClient, und doppelklicken Sie dann auf Form1.cs, um das Formular zu öffnen.

  2. Klicken Sie mit der rechten Maustaste auf Form1.cs, klicken Sie auf Umbenennen, und geben Sie OrderForm.cs.

  3. Bestätigen Sie den Vorgang, indem Sie auf Ja klicken.

  4. Fügen Sie dem Formular aus der Toolbox vier Bezeichnungssteuerelemente, fünf Textfeldsteuerelemente und drei Schaltflächensteuerelemente hinzu, und positionieren Sie die Steuerelemente wie im folgenden Screenshot dargestellt:

    Clientformular „Bestellung“

  5. Klicken Sie im Workflow auf das Formular, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    OrderForm

    Text

    Contoso.com-Bestellformular

  6. Klicken Sie im Workflow auf Bezeichnung1, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    lblOrderNumber

    Text

    Auftragsnummer:

  7. Klicken Sie im Workflow auf Bezeichnung2, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    lblEmail

    Text

    E-Mail:

  8. Klicken Sie im Workflow auf Bezeichnung3, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    lblDescription

    Text

    Beschreibung:

  9. Klicken Sie im Workflow auf Bezeichnung4, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    lblQuantity

    Text

    Menge:

  10. Klicken Sie im Workflow auf Textfeld1, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    txtOrderNumber

    Aktiviert

    False

  11. Klicken Sie im Workflow auf Textfeld2, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    txtEmail

    Text

    JohnDole@fabrikam.com

  12. Klicken Sie im Workflow auf Textfeld3, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    txtDescription

    Text

    Windows 7

  13. Klicken Sie im Workflow auf Textfeld4, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    txtQuantity

    Text

    10

  14. Klicken Sie im Workflow auf Textfeld5, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    txtStatus

    Anker

    Unten, links, rechts

    Aktiviert

    False

    Text

    “”

  15. Klicken Sie im Workflow auf Schaltfläche1, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    btnSubmit

    Anker

    Unten, rechts

    Text

    Senden

    Klicken (auf der Registerkarte Ereignis)

    btnSubmit_Click

  16. Klicken Sie im Workflow auf Schaltfläche2, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    btnUpdate

    Anker

    Unten, rechts

    Text

    Aktualisieren

    Klicken (auf der Registerkarte Ereignis)

    btnUpdate_Click

  17. Klicken Sie im Workflow auf Schaltfläche3, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.

    Eigenschaft Wert

    Name

    btnCancel

    Anker

    Unten, rechts

    Text

    Abbrechen

    Klicken (auf der Registerkarte Ereignis)

    btnCancel_Click

  18. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderForm.cs, und klicken Sie dann auf Code anzeigen.

  19. Klicken Sie mit der rechten Maustaste auf den Namespace OrderClient, klicken Sie auf Umgestalten, und klicken Sie dann auf Umbenennen, um das Dialogfeld Umbenennen zu öffnen.

  20. Geben Sie im Feld Umbenennen den Eintrag Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient ein, und klicken Sie dann auf OK.

  21. Klicken Sie auf Übernehmen.

  22. Ersetzen Sie den Code mit dem folgenden:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient
    {
        public partial class OrderForm : Form
        {
            //Delegates to make all service calls on a secondary thread
            private delegate void SubmitOrderDelegate();
            private delegate void CancelOrderDelegate();
            private delegate void UpdateOrderDelegate();
            private delegate void CallbackDelegate(string poID, string str);
    
            private SubmitOrderDelegate SubmitOrderHandler;
            private CancelOrderDelegate CancelOrderHandler;
            private UpdateOrderDelegate UpdateOrderHandler;
            private CallbackDelegate CallbackHandler;
    
            public OrderForm()
            {
                InitializeComponent();
            }
    
            private void OrderForm_Load(object sender, EventArgs e)
            {
                btnUpdate.Enabled = false;
                btnCancel.Enabled = false;
                btnSubmit.Focus();
            }
    
            #region Submit button
            private void btnSubmit_Click(object sender, EventArgs e)
            {
                btnSubmit.Enabled = false;
                btnCancel.Enabled = false;
                btnUpdate.Enabled = false;
                txtEmail.Enabled = false;
    
                txtStatus.Text = "Connecting to the Order service ...";
    
                //Executed on secondary thread so the UI thread is not blocked
                SubmitOrderHandler = new SubmitOrderDelegate(this.SubmitOrder);
                SubmitOrderHandler.BeginInvoke(null, null);
            }
    
            private void SubmitOrder()
            {
                string strMessage = "Your order has been received.";
                string strPOID = "";
    
                OrderWorkflowService.PurchaseOrder po = new OrderWorkflowService.PurchaseOrder();
                po.EmailAddress = txtEmail.Text;
                po.Description = txtDescription.Text;
                po.Quantity = System.Int32.Parse(txtQuantity.Text);
    
                //A Blocking service call executed on secondary thread
                try
                {
                    OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient();
                    strPOID = client.SubmitPO(po);
                    client.Close();
                }
                catch (Exception Ex)
                {
                    strMessage = "Error: " + Ex.Message;
                }
    
                //Make UI updates back on the primary thread
                CallbackHandler = new CallbackDelegate(this.SubmitOrderCallBack);
                this.BeginInvoke(CallbackHandler, strPOID, strMessage);
    
            }
    
            private void SubmitOrderCallBack(string strPOID, string strMessage)
            {
                //UI updates back on the primary thread
                btnUpdate.Enabled = true;
                btnCancel.Enabled = true;
    
                txtOrderNumber.Text = strPOID;
                txtStatus.Text = strMessage;
            }
            #endregion
    
            #region Update button
            private void btnUpdate_Click(object sender, EventArgs e)
            {
                btnUpdate.Enabled = false;
                btnCancel.Enabled = false;
    
                txtStatus.Text = "Connecting to the Order service ...";
    
                //Executed on secondary thread so the UI thread is not blocked
                UpdateOrderHandler = new UpdateOrderDelegate(this.UpdateOrder);
                UpdateOrderHandler.BeginInvoke(null, null);
    
            }
    
            private void UpdateOrder()
            {
                string strMessage = "Your order update request has been received.";
                string strPOID = "";
    
                OrderWorkflowService.PurchaseOrder po = new OrderWorkflowService.PurchaseOrder();
                po.POID = txtOrderNumber.Text;
                po.EmailAddress = txtEmail.Text;
                po.Description = txtDescription.Text;
                po.Quantity = System.Int32.Parse(txtQuantity.Text);
    
                try
                {
                    OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient();
                    strMessage = client.SubmitUpdate(po);
                    client.Close();
                }
                catch (Exception Ex)
                {
                    strMessage = "Error: " + Ex.Message;
                }
    
                //Make UI updates back on the primary thread
                CallbackHandler = new CallbackDelegate(this.UpdateOrderCallback);
                this.BeginInvoke(CallbackHandler, strPOID, strMessage);
    
            }
    
            private void UpdateOrderCallback(string strPOID, string strMessage)
            {
                //UI updates back on the primary thread
                btnUpdate.Enabled = true;
                btnCancel.Enabled = true;
    
                txtStatus.Text = strMessage;
            }
            #endregion
    
            #region Cancel button
            private void btnCancel_Click(object sender, EventArgs e)
            {
                btnUpdate.Enabled = false;
                btnCancel.Enabled = false;
    
                txtStatus.Text = "Connecting to the Order service ...";
    
                //Executed on secondary thread so the UI thread is not blocked
                CancelOrderHandler = new CancelOrderDelegate(this.CancelOrder);
                CancelOrderHandler.BeginInvoke(null, null);
            }
    
            private void CancelOrder()
            {
                string strInOut = txtOrderNumber.Text;
    
                try
                {
                    OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient client = new OrderWorkflowService.MicrosoftSamplesDublinTutorialsOrderServiceOrderWorkflowServiceIOrderWorkflowServiceClient();
                    client.SubmitCancellation(ref strInOut);
                    client.Close();
                }
                catch (Exception Ex)
                {
                    strInOut = "Error: " + Ex.Message;
                }
    
                //Make UI updates back on the primary thread
                CallbackHandler = new CallbackDelegate(this.CancelOrderCallback);
                this.BeginInvoke(CallbackHandler, txtOrderNumber.Text, strInOut);
            }
    
            private void CancelOrderCallback(string strPOID, string strMessage)
            {
                //UI updates back on the primary thread
                //btnUpdate.Enabled = true;
                //btnCancel.Enabled = true;
    
                txtStatus.Text = strMessage;
            }
            #endregion
        }
    }
    

So kompilieren Sie den Auftragsclient

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderClient, und klicken Sie dann auf Neu erstellen. Vergewissern Sie sich im Ausgabefenster, dass das Projekt erfolgreich kompiliert wurde.

Testen von Order Service

So testen Sie den Order Service

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderClient, und klicken Sie dann auf Als Startprojekt festlegen.

  2. Klicken Sie in Visual Studio auf des Menü Debuggen, und klicken Sie dann auf Debugging starten. Damit sollte ein Windows-Formular geöffnet werden.

  3. Klicken Sie im Formular auf Senden.

  4. Öffnen Sie Windows-Explorer, und navigieren Sie zum Ordner C:\DublinTutorial\Inbox.

  5. Warten Sie, bis alle drei E-Mail-Benachrichtigungen angezeigt werden. Es dauert etwa drei bis vier Minuten, bis alle drei Dateien angezeigt werden.

Packen von Order Service

So packen Sie den WCF-Dienst „OrderProcessingService“

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderProcessingService, und klicken Sie dann auf Einstellungen packen/veröffentlichen.

  2. Geben Sie die folgenden Werte ein:

    Eigenschaft Wert

    Webpaket als ZIP-Datei erstellen

    (aktiviert)

    Speicherort, an dem das Paket erstellt werden soll

    C:\DublinTutorial\DeploymentPackages\OrderProcessingService.zip

    Name der IIS-Website/Anwendung, der auf dem Zielserver verwendet werden soll

    OrderService/OrderProcessingService

  3. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderProcessingService, und klicken Sie dann auf Paket erstellen.

  4. Wiederholen Sie das vorstehende Verfahren, um mit den folgenden Einstellungen Pakete für die anderen drei Projekte zu erstellen:

    Projektname Speicherort, an dem das Paket erstellt werden soll Name der IIS-Website/Anwendung, der auf dem Zielserver verwendet werden soll

    OrderWorkflowService

    C:\DublinTutorial\DeploymentPackages\OrderWorkflowService.zip

    OrderService/OrderWorkflowService

    ShippingService

    C:\DublinTutorial\DeploymentPackages\ShippingService.zip

    OrderService/ShippingService

    Hinweis

    Möglicherweise möchten Sie die Endpunktadressen der abhängigen Dienste in den Web.config-Dateien aktualisieren, um vor dem Packen eines Diensts die Server anzugeben, auf denen die Pakete bereitgestellt werden.

Siehe auch

Konzepte

Lernprogramm zum Verwenden der Benutzeroberfläche von Windows Server AppFabric
Lernprogramm zum Verwenden von Windows PowerShell

  2011-12-05