2017-05-01 2 views
7

Ich versuche, eine einfache Abwesenheitsantrag-Anwendung in Windows Workflow Foundation 4.5 zu erstellen, löst die folgende Ausnahme, wie der Workflow versucht, ohne warten auf die Aktivität genehmigenRequest abzuschließen.Human-basierte Aufgabe in Windows-Workflow-Basis

Zwei SendParameters Objekte mit gleichen ServiceContractName und Operation 'ApplyLeave' verschiedene Parameternamen haben.

Können Sie mir bitte vorschlagen, was fehlt?

using System; 
using System.ServiceModel.Activities; 
using System.Activities; 
using System.ServiceModel; 
using System.Activities.Statements; 

namespace DemoWF 
{ 
    public class _25_LeaveRequest 
    { 
     public WorkflowService GetInstance() 
     { 
      WorkflowService service; 
      Variable<int> empID = new Variable<int> { Name = "empID" }; 
      Variable<int> requestID = new Variable<int> { Name = "requestID" }; 

     Receive receiveLeaveRequest = new Receive 
     { 
      ServiceContractName = "ILeaveRequestService", 
      OperationName = "ApplyLeave", 
      CanCreateInstance = true, 
      Content = new ReceiveParametersContent 
      { 
       Parameters ={ 
        {"empID",new OutArgument<int>(empID)} 
       } 
      } 
     }; 

     SendReply replyLeaveRequestID = new SendReply 
     { 
      Request = receiveLeaveRequest, 
      Content = new SendParametersContent 
      { 
       Parameters ={ 
          {"requestID",new InArgument<int>(requestID)}, 
         }, 
      }, 
     }; 

     Receive approveRequest = new Receive 
     { 
      ServiceContractName = "ILeaveRequestService", 
      OperationName = "ApproveLeave", 
      CanCreateInstance = true, 
      Content = new ReceiveParametersContent 
      { 
       Parameters ={ 
        {"requestID",new OutArgument<int>(requestID)} 
       } 
      } 
     }; 

     SendReply sendApproval = new SendReply 
     { 
      Request = receiveLeaveRequest, 
      Content = new SendParametersContent 
      { 
       Parameters ={ 
          {"approved",new InArgument<int>(0)}, 
         }, 
      }, 
     }; 

     Sequence workflow = new Sequence() 
     { 
      Variables = { empID, requestID }, 
      Activities = { 
       new WriteLine{Text="WF service is starting..."}, 
       receiveLeaveRequest, 
       new WriteLine{ 
        Text=new InArgument<string>(aec=> "Emp ID="+empID.Get(aec).ToString()) 
       }, 
       new Assign<int>{ 
        Value=new InArgument<int>(5), 
        To=new OutArgument<int>(requestID) 
       }, 
       new WriteLine{ 
        Text=new InArgument<string>(aec=> "Request ID="+requestID.Get(aec).ToString()) 
       }, 
       replyLeaveRequestID, 
       approveRequest, 
       new WriteLine{Text="Approved"}, 
       sendApproval 
      }, 
     }; 

     service = new WorkflowService 
     { 
      Name = "AddService", 
      Body = workflow 
     }; 
     return service; 
    } 
} 

}

und gehostet, wie unten erwähnt

namespace DemoWF 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      LeaveRequest(); 
     } 

     private static void LeaveRequest() 
     { 
      _25_LeaveRequest receiveAndReplyWorkflow = new _25_LeaveRequest(); 
      WorkflowService wfService = receiveAndReplyWorkflow.GetInstance(); 
      Uri address = new Uri("http://localhost:8000/WFServices"); 
      WorkflowServiceHost host = new WorkflowServiceHost(wfService, address); 

      try 
      { 
       Console.WriteLine("Opening Service..."); 
       host.Open(); 

       Console.WriteLine("WF service is listening on " + address.ToString() + ", press any key to close"); 
       Console.ReadLine(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("some thing bad happened" + e.StackTrace); 
      } 
      finally 
      { 
       host.Close(); 
      } 
     } 
    } 
} 

Antwort

0

Sie haben wahrscheinlich zwei Methoden mit dem gleichen Namen, die zwei Parameter erhalten. Da Sie jedoch Objekte an Ihren WF-Dienst senden, können diese an eine dieser Methoden übergeben werden, sodass der WF-Dienst nicht wissen kann, welche davon ausgeführt werden soll.

Als ersten Schritt sollten Sie Ihre 'Leave' Methodensignatur in Ihren Dienst Überlastungen ändern, so anstelle von:

public object ApplyLeave(SomeType1 t1, SomeType2 t2) {...} 
public object ApplyLeave(SomeType3 t3, SomeType4 t4) {...} 

es Fabrikat:

public object ApplyLeaveA(SomeType1 t1, SomeType2 t2) {...} 
public object ApplyLeaveB(SomeType3 t3, SomeType4 t4) {...} 

Und in Ihrem Code aufrufen genaue Methode, die Sie verwenden möchten.

+0

Vielen Dank für Ihren wertvollen Beitrag, es hat geholfen. –

+0

Gern geschehen :) Ich freue mich, dass es geholfen hat. –