2014-10-02 15 views
0

WorkflowServiceHost, WorkflowServiceHostFactory 및 WorkflowHostingEndpoint를 사용하여 IIS에서 WF4.5 워크 플로를 호스팅하는 응용 프로그램이 있습니다.WF 4.5 북마크 된 사용자 지정 활동이 지속/언로드되지 않음

워크 플로는 VS 2013에서 .xaml 파일로 정의됩니다. 워크 플로우에는 사용자로부터 입력 데이터를 수신하기위한 커스텀 액티비티가 있습니다. CreateBookmark 및 이력서의 콜백을 사용하여 가져 오기.

내 문제는 다음과 같습니다. 첫 번째 작업이 실행되고 워크 플로 인스턴스가 유휴 상태로 유지되고 언로드됩니다. 첫 번째 책갈피를 다시 시작한 후 두 번째 작업은 워크 플로 인스턴스가 유휴 상태로만 실행되도록 실행합니다. 따라서 첫 번째 활동 만 워크 플로우 인스턴스를 지속 및 언로드합니다.

호스트 구현이 작동하는지 확인하기 위해 지연 작업을 사용했으며 모든 것이 작동합니다.

내 사용자 지정 작업 : 북마크 활동의 결론 (createbookmark/이력서) 더/언로드를 지속없는 인스턴스 후

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를 설정했습니다. 는 완료, 대기, 대기, 대기, 대기, 대기, 재개, 언로드, 유휴, 지속 형 시작을 삭제 : 여기

인스턴스의 추적 상태입니다.

문제를 나타내는 샘플 솔루션을 만들었습니다.

누군가가 나를 도울 수 있다면 정말 고맙습니다. 어떤 도움을 주셔서 감사합니다!

도움 주셔서 감사합니다.

답변

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입니다. 따라서 북마크를 만들므로 사용자 정의 액티비티가 유휴 상태로 유지 되더라도 절대로 지속되지 않습니다 (적어도 오랜 시간 동안).

는 편집 :

:

샘플을 가지고 노는 일부 문서를 읽고 나면, 당신이해야 할 것은 이것은 간단히 here을 지적 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를 호출하는 것입니다

책갈피를에서 수동으로 추출하려면 OnResolveBookmark를 재정의하십시오.들어오는 메시지입니다. 이 메소드를 오버라이드 (override)하는 경우이 버그로 여부를 볼 수있는 경우 WorkflowHostingEndpoint

내가 알고하지 않습니다에 전송 된 메시지에 응답 할 수 있도록, 당신은 몸에 SendResponse를 호출해야합니다. 워크 플로 엔진은 북마크를 제공하여 유휴 상태가 되더라도 실제로는 으로 알려지지 않으므로이라는 응답 경고가 전송되지 않으므로 상태가 된 것 같습니다.

+0

내 WorkflowServiceHostFactory 클래스에서 WorkflowIdleBehavior를 통해 workflowIdle을 구성했습니다. 그리고 이것은 첫 번째 활동에는 효과가 있지만 두 번째 인스턴스는 유휴 상태 만 유지합니다. –

+0

게시 한 샘플을 살펴보십시오. –

+0

수정 된 답변을 확인하십시오. 희망이 도움이됩니다. – Joao