2014-10-02 68 views
0

我已经使用WorkflowServiceHost中,WorkflowServiceHostFactory和WorkflowHostingEndpoint的应用程序,主机WF4.5工作流程IIS。WF 4.5书签自定义活动不火持续/卸载

工作流由VS 2013在.xaml文件中定义。在工作流程中,具有用于接收来自用户的输入数据的自定义活动。获取使用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 /简历)的情况下没有更多的坚持/卸载后。

换句话说,只有第一个书签活动集实例才会卸载。是的,我设置了TimeToPersist/TimeToUnload。

这里是实例的跟踪状态: 开始,空闲,坚持,卸载,已恢复,空闲,空闲,空闲,空闲,空闲,已完成,已删除

我创建了一个演示问题的示例解决方案。

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

谢谢你的帮助!

回答

0

工作流实例将在运行时持续仅当它进入一个持久化的状态,或者,当它进入空闲状态或Persist活性被使用。

WorkflowServiceHost不会给你什么时候控制工作流实例的持续时间,但你可以在时配置。检查How to: Configure Idle Behavior with WorkflowServiceHost

报价:

工作流进入空闲状态时,他们遇到了必须由一些外部刺激来恢复 书签,例如当工作流实例是 等待消息使用接收活动来交付。 WorkflowIdleBehavior是一个行为允许你指定当服务实例出现闲置,当实例 持续或卸载之间的时间 。它包含两个属性,使您能够设置这些时间跨度的 。 TimeToPersist指定工作流服务实例空闲时的 与持久保存工作流程 的时间间隔。TimeToUnload指定当工作流服务实例进入空闲状态并在 工作流服务实例被卸载,在卸载意味着持续 的实例的实例存储,并从内存

<behaviors> 
    <serviceBehaviors> 
     <behavior name=""> 
      <workflowIdle timeToUnload="0:05:0" timeToPersist="0:04:0"/> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

注意取出之间的时间跨度 timeToPersist的默认值是MaxValue。所以,尽管您的自定义活动因为您创建书签而变得闲置,但它永远不会持续(至少在很长的时间内)。

编辑:

与样品玩耍,阅读一些文件后,你需要做的是内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; 
} 

调用SendResponse这是简单地指出here

重写OnResolveBookmark手动从提取书签传入消息。如果重写此方法,您必须调用在它的身上 SendResponse这样,如果这可以被看作是错误或不向发送到 WorkflowHostingEndpoint

我不知道的消息作出响应。工作流程引擎似乎进入了一种状态,虽然由于您给它一个书签而空闲,但它并不真正已知它,因为不会发送有关它的响应警告。

+0

在我的WorkflowServiceHostFactory类中,我通过WorkflowIdleBehavior配置了workflowIdle。这对于第一个活动来说工作得很好,但是第二个活动只保持空闲。 – 2014-10-02 16:44:28

+0

请看看我发布的示例。 – 2014-10-03 17:53:57

+0

检查我编辑的答案。希望能帮助到你。 – Joao 2014-10-05 17:33:12