WF 4.5书签自定义活动不会持续/卸载

时间:2014-10-02 14:49:44

标签: .net workflow-foundation-4 workflow-foundation-4.5

我有一个使用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.

如果有人能帮助我,我真的很感激。谢谢你的帮助!

感谢您的帮助!

1 个答案:

答案 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

中致电OnResolveBookmark
protected 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

我不知道这是否可以被视为一个错误。工作流引擎似乎进入一种状态,虽然它因为你给它一个书签而空闲,但它并不真正知道,因为它的响应警告永远不会发送。