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 Microsoft AppFabric 1.1 für Windows Server zum Bereitstellen, zum Überwachen und zur Problembehandlung 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 Microsoft AppFabric 1.1 für Windows Server-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 Microsoft AppFabric 1.1 für Windows Server-Oberfläche für den Anhang nicht komplett durcharbeiten müssen – installieren Sie einfach die Dateien. Anweisungen zum Installationsvorgang des Lernprogramms zum Verwenden der Microsoft AppFabric 1.1 für Windows Server-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:
Entwickeln des WCF-Diensts für die Auftragsverarbeitung
Entwickeln des WCF-Diensts für den Versand
Entwickeln des WF-Diensts für den Auftragsworkflow
Fertigstellen des WCF-Diensts für die Auftragsverarbeitung
Fertigstellen des WCF-Diensts für den Versand
Entwickeln der Auftragsclientanwendung
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
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.
Klicken Sie im Menü Datei auf Neu und dann auf Neues Projekt.
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)
Erweitern Sie in Projektmappen-Explorer den Eintrag OrderProcessingService, klicken Sie mit der rechten Maustaste auf IService1.cs, und klicken Sie dann auf Löschen.
Klicken Sie auf OK, um das dauerhafte Löschen der Datei zu bestätigen.
Erweitern Sie in Projektmappen-Explorer den Eintrag OrderProcessingService, klicken Sie mit der rechten Maustaste auf Service1.svc, und klicken Sie dann auf Löschen.
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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderProcessService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.
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.
Doppelklicken Sie in Projektmappen-Explorer auf IOrderProcessing.cs, um die Datei zu öffnen.
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.
Geben Sie im Feld Neuer Namen den Eintrag Microsoft.Samples.Dublin.Tutorials.OrderService.OrderProcessingService ein, und klicken Sie dann auf OK.
Klicken Sie auf Übernehmen, und klicken Sie dann auf Ja.
Ä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
Doppelklicken Sie in Projektmappen-Explorer auf IOrderProcessing.cs, um die Datei zu öffnen.
Ä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
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
- 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
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.
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
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.
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
Erweitern Sie in Projektmappen-Explorer den Eintrag ShippingService, klicken Sie mit der rechten Maustaste auf IService1.cs, und klicken Sie dann auf Löschen.
Klicken Sie auf OK, um das dauerhafte Löschen der Datei zu bestätigen.
Erweitern Sie in Projektmappen-Explorer den Eintrag ShippingService, klicken Sie mit der rechten Maustaste auf Service1.svc, und klicken Sie dann auf Löschen.
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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf ShippingService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.
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.
Doppelklicken Sie in Projektmappen-Explorer auf IShipping.cs, um die Datei zu öffnen.
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.
Geben Sie im Feld Neuer Namen den Eintrag Microsoft.Samples.Dublin.Tutorials.OrderService.ShippingService ein, und klicken Sie dann auf OK.
Klicken Sie auf Übernehmen, und klicken Sie dann auf Ja.
Ä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
Doppelklicken Sie in Projektmappen-Explorer auf Shipping.svc, um die Datei zu öffnen.
Ä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
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
- 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
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.
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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderWorkflowService, und klicken Sie dann auf Dienstverweis hinzufügen.
Klicken Sie unter Dienstverweis hinzufügen auf Ermitteln. Visual Studio sollte nun beide Dienste ermitteln.
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
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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderWorkflowService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.
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
Doppelklicken Sie in Projektmappen-Explorer auf SendNotification.cs, um die Datei zu öffnen.
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.
Geben Sie im Feld Neuer Namen den Eintrag Microsoft.Samples.Dublin.Tutorials.OrderService.OrderWorkflowService ein, und klicken Sie dann auf OK.
Klicken Sie auf Übernehmen, und klicken Sie dann auf Ja.
Ä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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderWorkflowService, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neues Element.
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
Doppelklicken Sie in Projektmappen-Explorer auf DataTypes.cs, um die Datei zu öffnen.
Ä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; } }
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:
Zusammenstellen des Workflows mithilfe von Aktivitäten
Definieren von Variablen
Konfigurieren der Aktivitäten
So definieren Sie den Workflow
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.
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.
Klicken Sie mit der rechten Maustaste auf die Aktivität Sequential Service, und klicken Sie dann auf Löschen.
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
Klicken Sie links im Fenster auf Toolbox, um den Bereich Toolbox zu öffnen, und verankern Sie die Toolbox auf der linken Seite des Fensters.
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.
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.
Verbinden Sie die Aktivitäten mit dem Mauszeiger, so dass sie wie folgt aussehen:
Klicken Sie am Fuß des Workflows auf Variablen, um den Bereich Variablen zu öffnen.
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:
Klicken Sie im Workflow auf die Aktivität Flowchart, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert DisplayName
Order Service
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
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
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
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
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
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.
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.
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.
Ordnen Sie die Aktivitäten wie folgt neu an:
Klicken Sie am Fuß des Workflows auf Variablen, um den Bereich Variablen zu öffnen.
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.
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)
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()
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
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.
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
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
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.
Klicken Sie unter dem Registerkartennamen auf Order Service, um die Flowchart-Aktivität „Order Service“ anzuzeigen.
Doppelklicken Sie im Workflow auf die Sequence-Aktivität Auftrag geöffnet, um den Status zu implementieren.
Ziehen Sie die folgenden Aktivitäten in der angegebenen Reihenfolge aus der Toolbox in den Workflow:
Kategorie Aktivität Hinweis Primitive
Assign
Ablaufsteuerung
Parallel
Ziehen Sie die folgende Aktivität in die Parallel-Aktivität:
Kategorie Aktivität Hinweis Ablaufsteuerung
Sequence
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
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.
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
Ziehen Sie die folgende Aktivität in die Aktivität Then branch of the If:
Kategorie Aktivität Hinweis Ablaufsteuerung
Sequence
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
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
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
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
Ziehen Sie die folgende Aktivität in die Aktivität Then branch of the If:
Kategorie Aktivität Hinweis Ablaufsteuerung
Sequence
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
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:
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.
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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”
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.
Klicken Sie unter dem Registerkartennamen auf Order Service, um die Flowchart-Aktivität „Order Service“ anzuzeigen.
Doppelklicken Sie im Workflow auf die Sequenzaktivität Auftrag verarbeitet, um den Status zu implementieren.
Ziehen Sie die folgenden Aktivitäten in der angegebenen Reihenfolge aus der Toolbox in den Workflow:
Kategorie Aktivität Hinweis Primitive
Assign
Ablaufsteuerung
Parallel
Ziehen Sie die folgende Aktivität in die Aktivität Parallel:
Kategorie Aktivität Hinweis Ablaufsteuerung
Sequence
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
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.
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
Ziehen Sie die folgende Aktivität in die Aktivität Then branch of the If:
Kategorie Aktivität Hinweis Ablaufsteuerung
Sequence
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
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
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
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
Ziehen Sie die folgende Aktivität in die Aktivität Then branch of the If:
Kategorie Aktivität Hinweis Ablaufsteuerung
Sequence
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
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:
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.
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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”
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.
Klicken Sie unter dem Registerkartennamen auf Order Service, um die Flowchart-Aktivität „Order Service“ anzuzeigen.
Doppelklicken Sie im Workflow auf die Sequence-Aktivität Auftrag abgeschlossen, um den Status zu implementieren.
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
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
Erweitern Sie in Projektmappen-Explorer den Eintrag OrderWorkflowService, 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.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
- 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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderProcessingService, und klicken Sie dann auf Dienstverweis hinzufügen.
Klicken Sie unter Dienstverweis hinzufügen auf Ermitteln. Visual Studio sollte nun beide Dienste ermitteln.
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“
Erweitern Sie in Projektmappen-Explorer den Eintrag OrderProcessingService, und doppelklicken Sie dann auf OrderProcessing.svc, um die Datei zu öffnen.
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
- 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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf ShippingService, und klicken Sie dann auf Dienstverweis hinzufügen.
Klicken Sie unter Dienstverweis hinzufügen auf Ermitteln. Visual Studio sollte nun beide Dienste ermitteln.
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“
Erweitern Sie in Projektmappen-Explorer den Eintrag ShippingService, und doppelklicken Sie dann auf Shipping.svc, um die Datei zu öffnen.
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
- 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
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.
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
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.
Klicken Sie unter Dienstverweis hinzufügen auf Ermitteln.
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
Erweitern Sie in Projektmappen-Explorer den Eintrag OrderClient, und doppelklicken Sie dann auf Form1.cs, um das Formular zu öffnen.
Klicken Sie mit der rechten Maustaste auf Form1.cs, klicken Sie auf Umbenennen, und geben Sie OrderForm.cs.
Bestätigen Sie den Vorgang, indem Sie auf Ja klicken.
Fügen Sie dem Formular aus der Toolbox vier Bezeichnungssteuerelemente, fünf Textfeldsteuerelemente und drei Schaltflächensteuerelemente hinzu.
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
Klicken Sie im Workflow auf Bezeichnung1, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert Name
lblOrderNumber
Text
Auftragsnummer:
Klicken Sie im Workflow auf Bezeichnung2, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert Name
lblEmail
Text
E-Mail:
Klicken Sie im Workflow auf Bezeichnung3, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert Name
lblDescription
Text
Beschreibung:
Klicken Sie im Workflow auf Bezeichnung4, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert Name
lblQuantity
Text
Menge:
Klicken Sie im Workflow auf Textfeld1, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert Name
txtOrderNumber
Aktiviert
False
Klicken Sie im Workflow auf Textfeld2, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert Name
txtEmail
Text
JohnDole@fabrikam.com
Klicken Sie im Workflow auf Textfeld3, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert Name
txtDescription
Text
Windows 7
Klicken Sie im Workflow auf Textfeld4, und legen Sie im Bereich Eigenschaften die folgenden Werte fest.
Eigenschaft Wert Name
txtQuantity
Text
10
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
“”
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
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
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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf OrderForm.cs, und klicken Sie dann auf Code anzeigen.
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.
Geben Sie im Feld Umbenennen den Eintrag Microsoft.Samples.Dublin.Tutorials.OrderService.OrderClient ein, und klicken Sie dann auf OK.
Klicken Sie auf Übernehmen.
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
- 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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderClient, und klicken Sie dann auf Als Startprojekt festlegen.
Klicken Sie in Visual Studio auf des Menü Debuggen, und klicken Sie dann auf Debugging starten. Damit sollte ein Windows-Formular geöffnet werden.
Klicken Sie im Formular auf Senden.
Öffnen Sie Windows-Explorer, und navigieren Sie zum Ordner C:\DublinTutorial\Inbox.
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“
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderProcessingService, und klicken Sie dann auf Einstellungen packen/veröffentlichen.
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
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt OrderProcessingService, und klicken Sie dann auf Paket erstellen.
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 AppFabric-Oberfläche
Lernprogramm zum Verwenden von Windows PowerShell
2012-03-05