2014-10-02 73 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