我有一个使用WorkflowServiceHost,WorkflowServiceHostFactory和WorkflowHostingEndpoint在IIS中托管WF4.5工作流的应用程序。
工作流由VS 2013在.xaml文件中定义。在工作流程中,a具有用于从用户接收输入数据的自定义活动。使用CreateBookmark和Resume的回调来获取它。
我的问题是:第一个活动执行,工作流实例进入空闲,持久和卸载。在恢复第一个书签后,第二个活动执行,工作流实例仅进入空闲状态。因此,只有第一个活动才能使工作流实例保持和卸载。
为了验证我的主机实现是否有效,我使用了延迟活动,一切正常。
我的自定义活动:
public sealed class WaitForResponse<TResult> : NativeActivity<TResult>
{
public string ResponseName { get; set; }
protected override bool CanInduceIdle
{
get
{
return true;
}
}
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark(this.ResponseName, new BookmarkCallback(this.ReceivedResponse));
}
protected void ReceivedResponse(NativeActivityContext context, Bookmark bookmark, object obj)
{
this.Result.Set(context, (TResult)obj);
}
}
IWorkflowCreation client = new ChannelFactory<IWorkflowCreation>(new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress("net.pipe://localhost/workflowCreationEndpoint")).CreateChannel();
//create an instance
Guid id = client.Create(null);
// Resume
client.ResumeBookmark(id, "1", "Message 1");
在书签活动(createbookmark / resume)结束后,实例不再持久/卸载。
换句话说,只有第一个加入书签的活动集实例才会卸载。是的,我已经设置了TimeToPersist / TimeToUnload。
以下是实例的跟踪状态: 已启动,空闲,已保留,已卸载,已恢复,已空闲,闲置,闲置,闲置,闲置,已完成,已删除。
我创建了一个演示问题的示例解决方案。 Sample for download.
如果有人能帮助我,我真的很感激。谢谢你的帮助!
感谢您的帮助!
答案 0 :(得分:0)
只有当工作流进入空闲状态或使用Persist活动时,工作流实例才会在进入持久状态时保持运行状态。
WorkflowServiceHost
无法控制何时保留工作流实例,但您可以在时配置。检查How to: Configure Idle Behavior with WorkflowServiceHost。
引用:
当工作流遇到必须恢复的书签时,它将处于空闲状态 通过一些外部刺激,例如当工作流实例是 等待使用Receive活动传递消息。 WorkflowIdleBehavior是一种允许您指定时间的行为 服务实例空闲时和实例之间的时间 持续或卸载。它包含两个使您可以使用的属性 设定这些时间跨度。 TimeToPersist指定之间的时间跨度 当工作流服务实例进入空闲状态和工作流时 服务实例是持久的。 TimeToUnload指定时间跨度 在工作流服务实例进入空闲状态和何时进行 卸载工作流服务实例,其中卸载意味着持久化 实例存储的实例并将其从内存中删除
<behaviors>
<serviceBehaviors>
<behavior name="">
<workflowIdle timeToUnload="0:05:0" timeToPersist="0:04:0"/>
</behavior>
</serviceBehaviors>
</behaviors>
请注意,timeToPersist的默认值为MaxValue 。因此,虽然您的自定义活动因为您正在创建书签而闲置,但它永远不会持续存在(至少很长时间)。
修改强>
在使用您的示例并阅读一些文档后,您需要做的是在SendResponse
中致电OnResolveBookmarkprotected override Bookmark OnResolveBookmark(object[] inputs, OperationContext operationContext, WorkflowHostingResponseContext responseContext, out object value)
{
Bookmark bookmark = null;
value = null;
if (operationContext.IncomingMessageHeaders.Action.EndsWith("ResumeBookmark"))
{
//bookmark name supplied by client as input to IWorkflowCreation.ResumeBookmark
bookmark = new Bookmark((string)inputs[1]);
//value supplied by client as argument to IWorkflowCreation.ResumeBookmark
value = (string)inputs[2];
// !!! Call it here, for example. !!!
responseContext.SendResponse(null, null);
}
else
{
throw new NotImplementedException(operationContext.IncomingMessageHeaders.Action);
}
return bookmark;
}
简要指出here:
覆盖OnResolveBookmark以手动从中提取书签 传入的消息。如果重写此方法,则必须调用 SendResponse在其正文中以便响应发送给的消息 WorkflowHostingEndpoint
我不知道这是否可以被视为一个错误。工作流引擎似乎进入一种状态,虽然它因为你给它一个书签而空闲,但它并不真正知道,因为它的响应警告永远不会发送。