簡體   English   中英

WF 4.5已標記為書簽的自定義活動無法觸發持久/卸載

[英]WF 4.5 Bookmarked custom activity not fire persist/unload

我有一個使用WorkflowServiceHost,WorkflowServiceHostFactory和WorkflowHostingEndpoint在IIS中托管WF4.5工作流的應用程序。

VS 2013在.xaml文件中定義了工作流。 在工作流中,有一個自定義活動,用於從用戶接收輸入數據。 使用CreateBookmark和Resume的回調來獲取該信息。

我的問題是:執行第一個活動,工作流實例進入空閑,持久和卸載狀態。 恢復第一個書簽后,第二個活動將執行,工作流實例將變為僅空閑狀態。 因此,只有第一個活動才能使工作流實例得以持久和卸載。

為了驗證我的主機實現是否有效,我使用了一個Delay活動,並且一切正常。

我的自定義活動:

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");

完成書簽活動(創建書簽/恢復)后,該實例將不再持久/卸載。

換句話說,只有第一個加書簽的活動集實例會卸載。 是的,我已經設置了TimeToPersist / TimeToUnload。

這是實例的跟蹤狀態:已啟動, 空閑,持久,卸載 ,恢復,空閑,空閑,空閑,空閑,空閑,已完成,已刪除

我創建了一個示例解決方案來演示該問題。 下載樣本。

如果有人可以幫助我,我非常感謝。 感謝您的任何幫助!

感謝您的任何幫助!

工作流實例只有進入空閑狀態或使用Persist活動時才進入運行時狀態,才能在運行時保留。

WorkflowServiceHost不能讓您對何時保留工作流實例保持太多控制權,但是您可以配置when 檢查如何:使用WorkflowServiceHost配置空閑行為

報價:

當工作流遇到必須由某些外部刺激來恢復的書簽時,例如,當工作流實例正在等待使用Receive活動傳遞消息時,工作流將變為空閑狀態。 WorkflowIdleBehavior是一種行為,允許您指定服務實例進入空閑狀態以及實例被持久保存或卸載之間的時間。 它包含兩個屬性,使您可以設置這些時間跨度。 TimeToPersist指定工作流服務實例進入空閑狀態和持久化工作流服務實例之間的時間跨度。 TimeToUnload指定從工作流服務實例變為空閑到卸載工作流服務實例之間的時間間隔,其中卸載表示將實例持久保存到實例存儲並將其從內存中刪除

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

請注意, timeToPersist默認值為MaxValue 因此,盡管您的自定義活動由於正在創建書簽而變得閑置,但它永遠不會持續(至少很長一段時間!)。

編輯:

玩完示例並閱讀了一些文檔之后,您需要在OnResolveBookmark中調用SendResponse

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;
}

這是簡單地指出, 在這里

覆蓋OnResolveBookmark可以從傳入消息中手動提取書簽。 如果重寫此方法,則必須在其主體中調用SendResponse,以便響應發送給WorkflowHostingEndpoint的消息。

我不知道這是否可以視為錯誤。 工作流引擎似乎進入一種狀態,盡管它由於您為它添加了書簽而處於空閑狀態,但由於從未發送過有關它的響應警告,因此它實際上並不清楚

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM