A simple test of WF Messaging Activity
firstly create a WF service which act like normal WCF service to be our service for testing.
1. create a wf console project.
2. add a class which is responsible for building a workflow . here is the code.
{
public WorkflowService GetInstance()
{
WorkflowService service;
Variable<int> x = new Variable<int> { Name = "x" };
Variable<int> y = new Variable<int> { Name = "y" };
Variable<int> addResult =
new Variable<int> { Name = "addResult" };
Receive receive = new Receive
{
ServiceContractName = "ICalculateService",//Wcf合约名
OperationName = "GetData",//合约中的方法
CanCreateInstance = true,//必需的,收到消息后创建一个WF实例
Content = new ReceiveParametersContent
{
Parameters ={
{"xIn",new OutArgument<int>(x)},//接收消息中的"xIn"和"yIn"关键字的值,并赋值给x和y变量
{"yIn",new OutArgument<int>(y)}
}
}
};
Sequence workflow = new Sequence()
{
Variables = { x, y, addResult },
Activities = {
new WriteLine{Text="WF service is starting..."},
receive,
new WriteLine{Text="receive request with two numbers"},
new WriteLine{
Text=new InArgument<string>(aec=>"x="+x.Get(aec).ToString()+" y="+y.Get(aec))
},
new Assign<int>{
Value=new InArgument<int>(aec=>x.Get(aec)+y.Get(aec)),
To=new OutArgument<int>(addResult)
},
new WriteLine{
Text=new InArgument<string>(aec=>"addResult="+addResult.Get(aec).ToString())
},
new WriteLine{Text="Then send the result back to client"},
new SendReply{
Request=receive,
Content=new SendParametersContent{
Parameters=
{
{"addResult",new InArgument<int>(addResult)}//将addResult变量的值赋给返回消息中的元素“addResult”
//个人认为这里到底是InArgument还是OutArgument。要看这里是输入还是输出。如果是输出到这个参数。那么就是Out,反之就是In.
},
},
},
new WriteLine{Text="sent result back done"}
},
};
service = new WorkflowService
{
Name = "AddService",
Body = workflow
};
return service;
}
}
3. in the main method code .
{
static void Main(string[] args)
{
ReceiveAndReplyWorkflow rrw =new ReceiveAndReplyWorkflow();
WorkflowService wfService = rrw.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());
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine
("some thing bad happened" + e.StackTrace);
}
finally
{
host.Close();
}
}
}
4. and the configuration in app.config.
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
5. until now . the server endpoint is ready . ctrl +f5 make this service work.
6. you can use the wcf test client tool to verify the service working.
as we can see. this wcf has two input parameter . one return result. we can check it out in the "xml" tab.
above figure show the send and response message which contact with the service we build .
next . we will build a client which in charge of calling the service just like the work that wcf test client done.
1. we create a wf console project being the client.
2. add a class which is responsible for building a workflow . here is the code.
{
public Activity GetInstance()
{
Variable<int> x = new Variable<int>("x", 20);
Variable<int> y = new Variable<int>("y", 10);
Variable<int> addResult = new Variable<int>("addResult", 0);
var endpoint = new System.ServiceModel.Endpoint
{
AddressUri = new Uri("http://localhost:8000/WFServices"),//必须指定,要请求的WCF endpoint
Binding = new BasicHttpBinding(),
};
Send addRequest = new Send
{
ServiceContractName = "ICalculateService",
Endpoint = endpoint,
OperationName = "GetData",
Content = new SendParametersContent
{
Parameters = {
{"xIn",new InArgument<int>(x)},
{"yIn",new InArgument<int>(y)}
}
},
};
var workflow = new CorrelationScope
{
Body = new Sequence
{
Variables = { x, y, addResult },
Activities ={
new WriteLine{Text="Send x:20 and y:10 to WF service"},
addRequest,
new ReceiveReply{
Request=addRequest,//必须指定,在sendandreceivereplay activity 中会自动指定 如分别建立,send activity 和reveive activity时则要手动指定那个request.
Content=new ReceiveParametersContent{
Parameters={
{"addResult",new OutArgument<int>(addResult)}//第一个参数代表消息中的一个关键字。第二参数表示将前一个关键字中的值赋值给后一个变量,并生成一个出参。
}
},
},
new WriteLine{
Text=new InArgument<string>(aec=>("The result is:"+addResult.Get(aec).ToString()))
},
new Delay
{
Duration= new TimeSpan(0,0,5)
}
}
}
};
return workflow;
}
}
3. the client main method code just is simply like this.
{
static void Main(string[] args)
{
SendAndReceiveWorkflow srw =new SendAndReceiveWorkflow();
WorkflowInvoker.Invoke(srw.GetInstance());
}
}
well . this is a beginning guild for building and consuming the WF service . in the real business .i believe it is much more complicated than this.
any comment are welcome . i will be appreciate for your attention. thanks
you can down load the project from here . testSendReceive.rar
posted on 2012-06-17 18:02 malaikuangren 阅读(318) 评论(0) 编辑 收藏 举报