3

this question 관련. WorkflowServiceHost를 사용하는 WF4 워크 플로 버전 관리

나는 WorkflowApplication를 사용하여 워크 플로우의 버전을 구현하는 방법을 이해합니다. 이전 버전의 워크 플로에 대한 원래 XAML 정의를 유지하는 경우 오른쪽 WorkflowApplication 생성자를 사용하여로드 할 수 있습니다.

어떻게 당신은 WorkflowServiceHost 당신이 IIS에서 워크 플로우를 호스트 할 올바른 워크 플로우 정의를 사용을 보장 할 수?

워크 플로 정의를로드하는 데 사용할 수있는 WorkflowServiceHost 생성자가 있지만 XAMLX 파일을 통해 IIS 내부를 호스팅 할 때 WorkflowServiceHost을 직접 호출하지 않아도됩니다. 이는 IIS에서 어떻게 든 처리됩니다. 그렇다면 올바른 워크 플로 정의가 올바른 워크 플로 버전에로드되었는지 어떻게 확인할 수 있습니까?

답변

8

WorkflowServiceHost를 사용하는 접근 방식은 WorkflowApplication을 사용하는 다른 형식이 아닙니다. 다양한 XAML (X) 버전을 계속 유지하는 기본 사항이 계속 적용됩니다. 따라서 WorkflowServiceHost의 경우 각각 다른 XAMLX 버전을 호스팅하는 여러 WorkflowServiceHost를 만들어야합니다. 각각 다른 엔드 포인트가 있습니다. 따라서 기본적으로 en 엔드 포인트는 워크 플로 서비스와 해당 버전을 처리합니다.

그래서 클라이언트에서 올바른 WorkflowServiceHost로 메시지를 가져 오는 방법은 무엇입니까? 여기 WCF 라우팅 서비스는 당신의 친구입니다. 클라이언트가 WorkflowServiceHost와 직접 통신하는 대신 중간 WCF 라우팅 서비스를 사용합니다. 이렇게하면 메시지가 확인되고 해당 XAMLX 파일을 호스팅하는 WorkflowServiceHost로 라우트됩니다. 어떻게 알 수 있습니까? 몇 가지 방법이 있습니다. 예를 들어 메시지 상관 식별자를 사용하여 새 워크 플로에 대한 요청과 함께 항상 마지막 버전으로 이동하는 데이터베이스 조회를 수행합니다. 가장 쉬운 방법은 워크 플로 서비스에서 초기 요청의 일부로 버전 번호를 반환하고 이후의 각 요청에서이 부분을 필수 구성 요소로 만드는 것입니다. 이렇게하면 WCF 라우팅 서비스는 메시지 데이터 만 보내면 모든 작업을 수행 할 수 있습니다.

예로들 수 :

  1. 클라이언트 주문 ID (7)을 사용하여 새로운 흐름을 개시하는 메시지를 전송하고 다시 3 버전을 수신한다. 클라이언트 응용 프로그램은 URL httl : //localhost/MyWorkflow.xaml을 사용하고 라우팅 서비스는 마지막 버전 인 httl : //localhost/MyWorkflow.v3.xamlx로 전달합니다. 이 워크 플로우로 전송
  2. 다음 메시지에 OrderID 및 버전을 모두 포함 3. 클라이언트 응용 프로그램은 URL의 HTTL을 사용 //localhost/MyWorkflow.xaml 및 라우팅 서비스 전달이 HTTL하기 : //localhost/MyWorkflow.v3.xamlx되는 표시된 버전.
  3. 클라이언트 앱이 이전 워크 플로에 메시지를 보내려고합니다. orderid 2와 버전 1을 사용합니다 (이 워크 플로우가 시작될 때 응답 됨). 클라이언트 응용 프로그램은 URL httl : //localhost/MyWorkflow.xaml을 사용하고 라우팅 서비스는 추가 된 버전 인 httl : //localhost/MyWorkflow.v1.xamlx로 전달합니다.

WCF 라우팅 서비스에 대한 자세한 내용은 these 스크린 캐스트를 확인하십시오.

+0

정교한 답변을 주셔서 감사합니다. 이 일을 끝내기 위해 꽤 많은 배관 공사가 필요합니다. –

+2

예. 아직 완전히 구워지지 않은 분야 중 하나입니다. – Maurice

+0

안녕하세요! 버전 관리에 대해 약간의 질문이 있습니다. 워크 플로에서 참조되는 어셈블리는 어떻습니까? 나는 나의 호스트 사이트 내 bin 디렉토리에 wf 파일을 배포했다. 그러나 내 persisted 인스턴스를 깨뜨린 (어셈블리 로직을 사용하여) 어셈블리 중 하나의 새로운 버전을 복사 할 때 잃어버린다. 여기 .. ​​.. 고마워! (ps. sorry my english sucks!)) – pabloide86