다음을 통해 공유


워크플로 서비스 호스트 확장성

.NET Framework 4.6.1은 워크플로 서비스를 호스팅하기 위한 클래스를 제공합니다 WorkflowServiceHost . 이 클래스는 관리되는 애플리케이션 또는 Windows 서비스에서 워크플로 서비스를 자체 호스팅할 때 사용됩니다. 이 클래스는 IIS(인터넷 정보 서비스) 또는 WAS(Windows Process Activation Service)를 사용하여 워크플로 서비스를 호스팅할 때도 사용됩니다. 이 클래스는 WorkflowServiceHost 사용자 지정 확장을 추가하고, 유휴 동작을 변경하고, 비서비스 워크플로(메시징 활동을 사용하지 않는 워크플로)를 호스트할 수 있는 확장 지점을 제공합니다.

워크플로 서비스 호스트 확장

WorkflowServiceHost에는 WorkflowExtensions의 속성이 있으며, 이는 WorkflowInstanceExtensionManager 형식으로 WorkflowServiceHost에 확장을 추가하는 메서드를 제공합니다. 메서드를 Add 사용하여 각 워크플로 서비스 인스턴스에 대한 확장을 추가합니다. 지정된 대리자는 워크플로 서비스 인스턴스를 만들거나 지속성 저장소에서 로드할 때 새 확장을 만들기 위해 호출됩니다. 이 메서드를 Add 사용하여 각 워크플로 서비스 호스트에 대한 확장을 추가합니다. 확장의 한 인스턴스는 모든 워크플로 서비스 인스턴스에 대해 공유됩니다.

처리되지 않은 예외에 대응

워크플로 WorkflowUnhandledExceptionBehavior 서비스 내에서 처리되지 않은 예외가 발생하는 경우 수행할 작업을 지정할 수 있습니다. 속성은 Action 값 중 하나를 지정합니다.WorkflowUnhandledExceptionAction

  • Abandon – 워크플로 서비스 인스턴스를 중단합니다.

  • AbandonAndSuspend – 마지막 지속형 상태로 롤백하고 워크플로 서비스 인스턴스를 일시 중단합니다. 워크플로가 이미 한 번 이상 유지된 경우에만 발생합니다. 그렇지 않은 경우 워크플로 인스턴스가 중단됩니다.

  • Cancel – 인스턴스를 취소합니다.

  • Terminate – 인스턴스를 종료합니다.

이 동작은 다음 예제와 같이 코드에서 구성할 수 있습니다.

host.Description.Behaviors.Add(new WorkflowUnhandledExceptionBehavior { Action = WorkflowUnhandledExceptionAction.Abandon });

다음 예제와 같이 구성 파일에서 구성할 수도 있습니다.

<behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
          <workflowUnhandledExceptionBehavior action="Abandon" />
        </behavior>
      </serviceBehaviors>
</behaviors>

비서비스 워크플로 호스팅

WorkflowServiceHost 는 비서비스 워크플로를 호스트하거나, Receive 활동으로 시작하지 않거나 메시징 활동을 사용하지 않는 워크플로를 호스트하는 데 사용할 수 있습니다. 워크플로 서비스는 일반적으로 Receive 활동으로 시작합니다. 워크플로 서비스에 대한 메시지를 받을 때, 아직 실행되거나 지속되지 않은 경우에 새로운 워크플로 서비스 인스턴스가 생성됩니다. 워크플로가 수신 활동으로 시작되지 않는 경우 메시지를 받을 활동이 없으므로 메시지를 전송하여 시작할 수 없습니다. 비서비스 워크플로를 호스트하려면 WorkflowHostingEndpoint에서 클래스를 파생시키고 OnGetInstanceId, OnGetCreationContext, OnResolveBookmark를 재정의하십시오. 기본으로 설정된 인스턴스 ID를 제공하고 싶다면 OnGetInstanceId를 재정의하세요. 사용자 지정 워크플로 만들기 컨텍스트를 위해 OnGetCreationContext를 재정의하거나 워크플로의 기존 인스턴스를 초기화하도록 WorkflowCreationContext를 사용하십시오. 수신 메시지에서 책갈피를 수동으로 추출하기 위해 OnResolveBookmark를 재정의합니다. 이 메서드를 재정의하는 경우 WorkflowHostingEndpoint로 전송된 메시지에 응답하도록 본문에서 호출 SendResponse 해야 합니다. 이렇게 하지 않으면 결국 한도를 MaxConcurrentCalls 초과할 수 있습니다. 양방향 계약에서는 클라이언트가 응답을 수신하지 못하여 호출 SendResponse 실패를 감지할 수 있습니다. 단방향 계약에서는 SendResponse의 스로틀 제한을 초과한 후에야 MaxConcurrentCalls를 호출하지 못한 실수를 너무 늦게 깨달을 수 있습니다. 비서비스 워크플로의 새 인스턴스를 만들려면 새 인스턴스를 만드는 작업을 정의하는 서비스 계약을 선언합니다. 만들기 작업은 필요한 워크플로 매개 변수를 전달하기 위해 IDictionary<문자열, 개체> 를 사용해야 합니다. 이 계약은 WorkflowHostingEndpoint가 파생된 클래스에 의해 암시적으로 구현됩니다. 워크플로를 호스팅할 때, WorkflowHostingEndpoint로부터 파생된 클래스의 인스턴스를 호스트에 추가하기 위해 AddServiceEndpoint을 호출하고 Open를 호출하십시오. 워크플로 인스턴스를 생성하려면, 서비스 계약 유형의 인스턴스를 생성하고 이를 사용하여 ChannelFactory<TChannel>을 호출하여 CreateChannel를 실행합니다. 그런 다음 서비스 계약에 정의된 만들기 작업을 호출할 수 있습니다.

참고하십시오