다음을 통해 공유


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

.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 작업으로 시작합니다. WorkflowServiceHost가 워크플로 서비스에 대한 메시지를 받을 때 실행 중이거나 지속된 워크플로 서비스가 없으면 새 워크플로 서비스 인스턴스가 만들어집니다. 워크플로가 받기 작업으로 시작하지 않으면 메시지를 받는 작업이 없기 때문에 메시지를 보내도 워크플로가 시작되지 않습니다. 서비스가 아닌 워크플로를 호스트하려면 WorkflowHostingEndpoint에서 클래스를 파생시키고 OnGetInstanceId, OnGetCreationContextOnResolveBookmark를 재정의합니다. 원하는 인스턴스 ID를 제공하려면 OnGetInstanceId를 재정의합니다. 사용자 지정 워크플로 생성 컨텍스트를 만들거나 기존 OnGetCreationContext의 인스턴스를 채우려면 WorkflowCreationContext를 재정의합니다. 들어오는 메시지에서 책갈피를 수동으로 추출하려면 OnResolveBookmark를 재정의합니다. 이 메서드를 재정의하는 경우 WorkflowHostingEndpoint에 전송된 메시지에 응답하도록 메시지 본문에서 SendResponse를 호출해야 합니다. 이렇게 하지 않으면 MaxConcurrentCalls 제한을 결국 초과할 수 있습니다. 양방향 계약에서는 클라이언트가 응답을 받지 못하기 때문에 SendResponse 호출 실패를 검색할 수 있습니다. 단방향 계약에서는 SendResponse 스로틀 제한이 초과된 후 너무 늦을 때까지 MaxConcurrentCalls 호출 실패 실수를 인식하지 못할 수 있습니다. 서비스가 아닌 워크플로의 새 인스턴스를 만들려면 새 인스턴스를 만드는 작업을 정의하는 서비스 계약을 선언합니다. 만들기 작업은 IDictionary<문자열, 개체>를 사용하여 필수 워크플로 매개 변수를 전달해야 합니다. 이 계약은 WorkflowHostingEndpoint 파생 클래스에 의해 암시적으로 구현됩니다. 워크플로를 호스트할 때는 WorkflowHostingEndpoint를 호출하여 AddServiceEndpoint 파생 클래스를 추가하고 Open을 호출합니다. 워크플로의 인스턴스를 만들려면 서비스 계약 형식의 ChannelFactory<TChannel>를 만들고 CreateChannel를 호출합니다. 그러면 서비스 계약에 정의된 만들기 작업을 호출할 수 있습니다.

참고 항목