The human task in the foundation of the Windows workflow

I am trying to create a simple send request application in the foundation 4.5 of a Windows workflow, it throws the following exception as the workflow tries to complete without waiting for the approveRequest action.

Two SendParameters objects with the same name ServiceContractName and OperationName 'ApplyLeave' have different parameter names.

Could you suggest me what is missing?

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; } } 

}

and posted as below

 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(); } } } } 
+7
c # workflow-foundation workflow-foundation-4
source share
1 answer

You probably have two methods with the same name that get two parameters. However, since you are sending objects to your WF service, you can apply them to one of these methods, and therefore the WF service cannot know which one to execute.

As a first step, you should change your Leave method, overloading the signature in your service, so instead

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

Do it:

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

And in your code call you need the exact method that you want to use.

0
source share

All Articles