방법: 워크플로 관리자 1.0용 워크플로 게시 및 실행

 

워크플로 관리자 1.0 시작 자습서의 이 단계에서는 범위를 만들고 작업 및 워크플로를 게시한 후 워크플로를 호출하는 워크플로 클라이언트 응용 프로그램을 만듭니다.또한 이 단계에서는 워크플로 리소스 브라우저(영어) 샘플에 대해 설명합니다.

참고

연습 동영상을 보거나 자습서의 시작 파일 및 전체 버전(워크플로 리소스 브라우저(영어) 등)을 다운로드하려면 워크플로 관리자 1.0 - 시작 자습서를 참조하세요.

이 자습서의 단계

  • Microsoft.Workflow.Samples.Common 프로젝트 추가

  • 워크플로 클라이언트 응용 프로그램 만들기

  • 워크플로 클라이언트 응용 프로그램 실행

  • 워크플로 리소스 브라우저 실행

  • 문제 해결 단계

Microsoft.Workflow.Samples.Common 프로젝트 추가

Microsoft.Workflow.Samples.Common 프로젝트는 범위, 작업 및 워크플로를 게시하는 등의 워크플로 관리자 프로젝트 관리를 간소화하는 도우미 클래스와 확장 메서드를 포함하고 있으며 이 단계의 솔루션에 추가되었습니다.

  1. 워크플로 관리자 1.0 - 시작 자습서에서 자습서 시작 파일을 다운로드하여 추출합니다.

  2. 방법: 워크플로 관리자 1.0용 사용자 지정 작업 만들기에 솔루션이 열려 있지 않으면 자습서의 이전 단계인 Visual Studio 2012에서 솔루션을 엽니다.

  3. 솔루션 탐색기에서 WFMgrGettingStarted를 마우스 오른쪽 단추로 클릭하고 추가, 기존 프로젝트를 선택합니다.

  4. 자습서 시작 파일을 추출한 위치를 찾아 다음 폴더로 이동합니다.

    <시작 파일 위치>\Start\Microsoft.Workflow.Samples.Common

  5. Microsoft.Workflow.Samples.Common.csproj를 선택하고 열기를 클릭합니다.

  6. Ctrl+Shift+B를 눌러 솔루션을 빌드합니다.

워크플로 클라이언트 응용 프로그램 만들기

이 단계에서는 워크플로 클라이언트 응용 프로그램을 만듭니다.워크플로 클라이언트 응용 프로그램은 범위를 만들고 작업과 워크플로를 범위에 게시한 후 워크플로를 호출합니다.워크플로가 실행되는 동안 클라이언트 응용 프로그램은 상태 업데이트를 확인하고 검색으로 찾은 제품이 포함된 상태를 표시합니다.응용 프로그램이 완료되면 범위가 정리되고 워크플로 아티팩트가 제거됩니다.

  1. 솔루션 탐색기에서 WFMgrGettingStarted를 마우스 오른쪽 단추로 클릭하고 추가, 새 프로젝트를 선택합니다.

  2. 설치 노드에서 Visual C#, 을 선택합니다..NET Framework 버전 드롭다운 목록에서 .NET Framework 4.5가 선택되어 있는지 확인합니다.목록에서 콘솔 응용 프로그램을 선택합니다.이름 상자에 GetProductsWorkflowClient를 입력하고 확인을 클릭합니다.

  3. 솔루션 탐색기에서 GetProductsWorkflowClient를 마우스 오른쪽 단추로 클릭하고 참조 추가를 선택합니다.

  4. 참조 추가 목록에서 솔루션을 선택하고 Microsoft.Workflow.Samples.CommonGetProductsActivities 옆의 상자를 선택합니다.

  5. 찾아보기 단추를 클릭하고 C:\Program Files\Reference Assemblies\Microsoft\Workflow Manager\1.0으로 이동합니다.

  6. Microsoft.Workflow.Client.dllMicrosoft.Activities.dll을 선택하고 추가를 클릭합니다.

  7. 확인을 클릭하여 참조 관리자 창을 닫고 참조를 추가합니다.

  8. 솔루션 탐색기에서 Program.cs를 두 번 클릭하여 코드를 표시합니다.

  9. 파일 맨 위에 다른 using 문과 함께 다음 using 문을 추가합니다(코드 조각 3).

    using Microsoft.Workflow.Client;
    using Microsoft.Workflow.Samples.Common;
    

    코드 조각 파일은 자습서에서 제공됩니다.이 파일을 사용하려면 워크플로 관리자 1.0 - 시작 자습서에서 자습서 시작 파일을 다운로드하세요.Visual Studio의 도구 메뉴에서 코드 조각 관리자를 선택합니다.언어 드롭다운에서 Visual C#을 선택한 후 추가 단추를 클릭합니다.시작 파일을 추출한 위치를 찾아 Assets\WFMgrGettingStarted 폴더를 선택합니다.폴더 선택, 확인을 차례로 클릭합니다.코드 파일에서 코드 조각을 삽입할 지점을 마우스 오른쪽 단추로 클릭하고 코드 조각 삽입을 선택합니다.목록을 아래로 스크롤하고 WFMgrGettingStarted를 두 번 클릭한 후 원하는 코드 조각을 두 번 클릭합니다.

  10. Program 클래스에 두 개의 다음 정적 멤버 변수를 추가합니다(코드 조각 4).

    static string workflowName = "GetProductsWorkflow";
    static string baseAddress = "https://<Base address>:12290/";
    
    System_CAPS_important중요

    baseAddress는 워크플로 관리자 서버를 가리켜야 합니다.개발 컴퓨터에서 워크플로 관리자 서버를 호스팅하는 경우 컴퓨터 이름을 검사하여 이 이름을 찾을 수 있습니다.컴퓨터 이름을 찾으려면 시작을 클릭하고 컴퓨터를 마우스 오른쪽 단추로 클릭한 후 전체 컴퓨터 이름을 확인합니다.전체 컴퓨터 이름을 사용하는 baseAddress를 https://Full computer name:12290과 같이 구성합니다. 예를 들면 https://mycomputername:12290/ 또는 https://myserver.mydomain.mycompany.com:12290/과 같습니다.

  11. 다음 코드 줄을 Main 메서드에 추가합니다(코드 조각 5).

    Console.Write("Setting up scope...");
    WorkflowManagementClient client = WorkflowUtils.CreateForSample(baseAddress, "WFMgrGettingStarted");
    WorkflowUtils.PrintDone();
    
    Console.Write("Publishing GetProducts activity...");
    client.PublishActivity("GetProducts", @"..\..\..\GetProductsActivities\GetProducts.xaml");
    WorkflowUtils.PrintDone();
    
    Console.Write("Publishing Workflow...");
    client.PublishWorkflow(workflowName, @"..\..\..\GetProductsActivities\GetProductsWorkflow.xaml");
    WorkflowUtils.PrintDone();
    

    이 코드는 Microsoft.Workflow.Samples.Common 프로젝트에 설명된 확장 메서드와 도우미 클래스를 사용하여 범위, 작업 및 워크플로를 게시하고 관리하는 작업을 간소화합니다.이 단계의 코드는 범위를 만들고 반환된 WorkflowManagementClient 인스턴스를 사용하여 GetProducts 및 GetProductsWorkflow를 범위에 게시합니다.

  12. 이전 코드 줄 뒤에 오도록 다음 코드 줄을 Main 메서드에 추가합니다.이 코드는 사용자에게 Northwind oData 서비스를 쿼리할 때 사용할 검색어를 요청합니다(코드 조각 6).

    Console.Write("Enter a search keyword: ");
    string SearchKeyword = Console.ReadLine();
    
  13. 이전 단계의 코드 뒤에 다음 코드 줄을 추가하여 워크플로 인스턴스를 시작합니다(코드 조각 7).

    Console.Write("Starting workflow instance...");
    WorkflowStartParameters startParameters = new WorkflowStartParameters();
    startParameters.Content.Add("SearchKeyword", SearchKeyword);
    string instanceId = client.Workflows.Start(workflowName, startParameters);
    WorkflowUtils.PrintDone();
    

    이 코드는 워크플로의 In 인수로 매핑되고 이 인수를 사용하여 워크플로 인스턴스를 시작하는 워크플로 시작 매개 변수를 어셈블합니다.

  14. 이전 단계의 코드 뒤에 오도록 다음 코드를 Main에 추가합니다(코드 조각 8).

    Console.WriteLine("\nPolling UserStatus...\n");
    string finalUserStatus = client.WaitForWorkflowCompletion(workflowName, instanceId);
    WorkflowUtils.Print("Completed with status: " + finalUserStatus, ConsoleColor.Green);
    

    이 코드는 WaitForWorkflowCompletion 프로젝트에 정의된 Microsoft.Workflow.Samples.Common 확장 메서드를 사용하여 워크플로가 완료될 때까지 대기하며, 대기하는 동안 SetStatus 작업으로 설정된 상태 업데이트를 확인합니다.

  15. 이전 단계의 코드 뒤에 오도록 다음 코드를 Main 끝에 추가합니다(코드 조각 9).

    Console.WriteLine("Press any key to clean up scope.");
    Console.ReadKey();
    
    client.CleanUp();
    
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
    

    범위가 정리되고 워크플로 아티팩트가 제거된 후 범위가 제거됩니다.프로덕션 시나리오에서는 일반적으로 관리자가 이러한 작업을 수행하지만 이 샘플의 목적에 맞게 코드에서 이러한 작업이 수행됩니다.

    다음 예제에는 전체 Program 클래스가 나와 있습니다(코드 조각 10).

    class Program
    {
        static string workflowName = "GetProductsWorkflow";
        static string baseAddress = "https:<Base address>:12290/";
    
        static void Main(string[] args)
        {
            Console.Write("Setting up scope...");
            WorkflowManagementClient client = WorkflowUtils.CreateForSample(baseAddress, "WFMgrGettingStarted");
            WorkflowUtils.PrintDone();
    
            Console.Write("Publishing GetProducts activity...");
            client.PublishActivity("GetProducts", @"..\..\..\GetProductsActivities\GetProducts.xaml");
            WorkflowUtils.PrintDone();
    
            Console.Write("Publishing Workflow...");
            client.PublishWorkflow(workflowName, @"..\..\..\GetProductsActivities\GetProductsWorkflow.xaml");
            WorkflowUtils.PrintDone();
    
            Console.Write("Enter a search keyword: ");
            string SearchKeyword = Console.ReadLine();
    
            Console.Write("Starting workflow instance...");
            WorkflowStartParameters startParameters = new WorkflowStartParameters();
            startParameters.Content.Add("SearchKeyword", SearchKeyword);
            string instanceId = client.Workflows.Start(workflowName, startParameters);
            WorkflowUtils.PrintDone();
    
            Console.WriteLine("\nPolling UserStatus...\n");
            string finalUserStatus = client.WaitForWorkflowCompletion(workflowName, instanceId);
            WorkflowUtils.Print("Completed with status: " + finalUserStatus, ConsoleColor.Green);
    
            Console.WriteLine("Press any key to clean up scope.");
            Console.ReadKey();
    
            client.CleanUp();
    
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    

워크플로 클라이언트 응용 프로그램 실행

System_CAPS_important중요

이 섹션의 단계에서는 Visual Studio를 관리 모드로 실행해야 합니다.Visual Studio가 관리 모드로 시작되지 않은 경우 Visual Studio를 닫고 관리 모드로 다시 시작한 후 솔루션을 다시 엽니다.

  1. 솔루션 탐색기에서 GetProductsWorkflowClient를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.

  2. Ctrl+F5를 눌러 응용 프로그램을 시작합니다.

    샘플을 실행하는 동안 문제가 발생하면 문제 해결 단계에서 일반적인 문제에 대한 해결 방법을 참조하세요.

  3. 범위가 설정되면 GetProducts 작업 및 GetProductsWorkflow가 게시되고 메시지가 표시되면 choc 같은 검색어를 입력한 후 Enter 키를 누릅니다.이러한 검색어를 사용하여 Northwind 샘플 데이터베이스에서 제품을 쿼리합니다.데이터베이스에서 처음 20개 제품(이 샘플에서 반환되는 최대값)을 반환하려면 검색어를 입력하지 않고 Enter 키를 누릅니다.

    GetProducts 작업은 http://services.odata.org/Northwind/Northwind.svc에서 호스팅되는 Northwind oData 서비스를 쿼리하고 검색 키워드와 일치하는 제품이 포함된 DynamicValue를 반환합니다.그런 다음 GetProductsWorkflow가 이를 반복하고 SetUserStatus 작업을 사용하여 사용자 상태 업데이트로 이를 지정합니다.클라이언트 응용 프로그램은 이러한 상태 업데이트를 확인하여 제품을 표시합니다.응용 프로그램이 완료된 후 범위를 정리하려면 아무 키나 누르라는 메시지가 표시됩니다.

  4. 아무 키나 눌러 범위를 정리한 후 아무 키나 눌러 종료합니다.

  5. Ctrl+F5를 눌러 응용 프로그램을 다시 실행하고 다른 검색어를 시도합니다.

    이 자습서 단계의 연습 동영상을 보려면 워크플로 관리자 1.0 - 시작 자습서를 참조하세요.

워크플로 리소스 브라우저 실행

이 작업에서는 워크플로 리소스 브라우저(영어) 샘플을 사용하여 워크플로 클라이언트 응용 프로그램에서 만든 범위 및 워크플로를 찾습니다.워크플로 리소스 브라우저(영어)는 개별적으로 다운로드할 수 있지만 Microsoft.Workflow.Samples.Common 프로젝트 추가 섹션에서 다운로드한 자습서 시작 파일에도 포함되어 있습니다.

  1. Visual Studio 2012의 새 인스턴스를 열고 파일 메뉴에서 열기, 프로젝트/솔루션을 선택합니다.

    System_CAPS_important중요

    WFMgrGettingStarted 솔루션은 이 단계에서 워크플로 리소스 브라우저 샘플과 함께 사용되므로 이 솔루션을 닫지 마십시오.

  2. 자습서 시작 파일을 추출한 위치를 찾아 다음 폴더로 이동합니다.

    <시작 파일 위치>\Workflow Resource Browser Tool

  3. WFExplorer.sln를 선택하고 열기를 클릭합니다.

  4. Ctrl+F5를 눌러 응용 프로그램을 빌드 및 실행합니다.

  5. 워크플로 서비스 주소를 묻는 메시지가 표시될 때 상자에 올바른 주소가 미리 채워져 있지 않으면 자습서를 실행할 때 사용한 기본 주소를 사용하고 연결을 클릭합니다.

  6. 자식 범위가 없는지 확인합니다.이전 Visual Studio 인스턴스로 전환하고 GetProductsWorkflowClient 응용 프로그램을 다시 실행합니다.검색어는 입력하지만 워크플로가 완료되면 범위를 정리하도록 아무 키나 누르지 마십시오.

  7. 워크플로 탐색기 창으로 전환하고 F5 키를 눌러 보기를 새로 고칩니다.

  8. WFMgrGettingStarted 범위가 있는지 확인합니다.WFMgrGettingStarted를 클릭하여 선택하고 두 개의 작업과 한 개의 워크플로가 있는지 확인합니다.GetProducts 작업과 GetProductsWorkflow가 모두 작업이지만 GetProductsWorkflow만 워크플로로 게시되었기 때문입니다.

  9. 오른쪽 창에서 여러 요소를 클릭하여 범위에서 해당 항목을 살펴보고 창 맨 위의 뒤로 단추를 사용하여 범위의 기본 보기로 돌아갑니다.

  10. GetProductsWorkflowClient 콘솔 창으로 전환하고 아무 키나 눌러 범위를 정리한 후 워크플로 탐색기 창으로 전환하고 F5 키를 눌러 새로 고친 후 범위가 제거되었는지 확인합니다.

문제 해결 단계

이 섹션의 단계는 Workflow Manager 응용 프로그램을 개발할 때 발생하는 일반적인 문제를 해결하는 데 사용할 수 있습니다.

  • 워크플로 클라이언트 응용 프로그램이 중지되거나 시간 제한 예외가 Throw됨

  • System.Net.WebException: 기본 연결이 닫혔습니다. SSL/TLS 보안 채널에 대해 트러스트 관계를 설정할 수 없습니다.

  • System.UnauthorizedAccessException: 호출자에게 이 작업에 필요한 권한이 없습니다.부여된 사용 권한: 없음.필수 사용 권한: WriteScope

  • System.Xaml.XamlObjectWriterException: 알 수 없는 형식 '{clr-namespace:GetProductsActivities}GetProducts'을(를) 만들 수 없습니다.

  • XAML에 오류가 있어서 작업을 로드할 수 없습니다.

  • 'https://schemas.microsoft.com/workflow/2012/xaml/activities' 네임스페이스에서 'DynamicValue' 형식을 찾을 수 없습니다.

워크플로 클라이언트 응용 프로그램이 중지되거나 시간 제한 예외가 Throw됨

다음 서비스가 시작되었는지 확인하고 응용 프로그램을 다시 실행해 보십시오.

  • 서비스 버스 게이트웨이

  • 서비스 버스 메시지 브로커

  • SQL Server(SQLEXPRESS 또는 사용자 서버)

  • 워크플로 관리자 백엔드

컴퓨터가 인터넷에 연결되어 있는지 확인합니다.샘플은 http://services.odata.org/Northwind/Northwind.svc에서 호스팅되는 Northwind odata 서비스를 쿼리하며 컴퓨터가 인터넷에 연결되어 있지 않으면 샘플이 정상적으로 작동하지 않습니다.가상 컴퓨터에서는 경우에 따라 시스템 트레이의 네트워크 아이콘을 클릭하고 문제 해결을 클릭하여 이 문제를 해결할 수 있습니다.인터넷 연결이 복원되면 샘플을 다시 시도해 보십시오.

baseAddress가 워크플로 관리자 서버를 참조하는지 확인합니다.워크플로 관리자 서버가 현재 컴퓨터에서 호스팅되는 경우 시작을 클릭하고 컴퓨터를 마우스 오른쪽 단추로 클릭하여 전체 컴퓨터 이름을 확인하고 전체 컴퓨터 이름을 사용하는 baseAddress를 https://Full computer name:12290과 같이 구성합니다. 예를 들면 https://mycomputer:12290/ 또는 https://myserver.mydomain.mycompany.com:12290/과 같습니다.

이 문제가 계속 발생하면 범위가 손상된 것일 수 있습니다.샘플이 실행되는 동안 중지되고 범위가 완전히 설정되거나 정리되지 않은 경우에 이러한 문제가 발생할 수 있습니다.서버가 실행되고 있고 기본 주소가 올바르지만 문제가 계속 발생할 경우 샘플의 범위 이름을 다음 예제와 같이 WFMgrGettingStarted2 등의 다른 이름으로 변경해 볼 수 있습니다.

WorkflowManagementClient client = WorkflowUtils.CreateForSample(baseAddress, "WFMgrGettingStarted2");

System.Net.WebException: 기본 연결이 닫혔습니다. SSL/TLS 보안 채널에 대해 트러스트 관계를 설정할 수 없습니다.

기본 주소와 IIS의 인증서에 사용된 주소가 일치하지 않거나 SSL 인증서가 구성되지 않은 경우에 이 문제가 발생할 수 있습니다(로컬 개발 컴퓨터의 경우일 수 있음).이 문제를 해결하려면 기본 주소가 인증서의 주소와 일치하는지 확인하거나 워크플로 관리자를 처음으로 액세스하기 전에 호출하도록 응용 프로그램에 다음 코드를 추가할 수 있습니다.

// The following code allows a client to use a non-fully qualified name and resolves https issues such as:
// System.Net.WebException: The underlying connection was closed: Could not establish trust 
// relationship for the SSL/TLS secure channel
// NOT for production, only for limited local development.
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(object sender,
            System.Security.Cryptography.X509Certificates.X509Certificate certificate,
            System.Security.Cryptography.X509Certificates.X509Chain chain,
            System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
};

System.UnauthorizedAccessException: 호출자에게 이 작업에 필요한 권한이 없습니다.부여된 사용 권한: 없음.필수 사용 권한: WriteScope

Visual Studio를 관리 모드로 시작하지 않은 상태에서 Visual Studio에서 샘플을 실행한 경우 이 예외가 발생할 수 있습니다.이 문제를 해결하려면 Visual Studio를 관리 모드로 시작합니다.

System.Xaml.XamlObjectWriterException: 알 수 없는 형식 '{clr-namespace:GetProductsActivities}GetProducts'을(를) 만들 수 없습니다.

이전에 게시된 작업을 참조하는 워크플로를 게시할 때 이 오류가 발생하면 다음 항목을 확인합니다.

사용자 지정 작업이 포함된 프로젝트의 Assembly.cs를 열고 다음 줄이 있는지 확인합니다.

[assembly: XmlnsDefinition("wf://workflow.windows.net/$Current/$Activities", "GetProductsActivities")]

두 번째 매개 변수는 사용자 지정 작업이 포함된 프로젝트의 네임스페이스와 일치해야 합니다.이 줄이 없으면 추가하고 파일 맨 위에 using System.Windows.Markup;을 추가합니다.사용자 지정 작업 프로젝트를 다시 빌드한 후 작업을 삭제하고 워크플로에 작업을 다시 추가합니다.워크플로에 작업이 다시 추가되면 워크플로 Xaml을 열고(솔루션 탐색기에서 워크플로를 마우스 오른쪽 단추로 클릭하고 연결 프로그램, XML (텍스트) 편집기 선택) 확인을 클릭한 후 다음 줄이 있는지 확인합니다.

xmlns:p1="wf://workflow.windows.net/$Current/$Activities"

XAML에 오류가 있어서 작업을 로드할 수 없습니다.

워크플로 디자이너에서 워크플로를 열 때 이 오류가 발생하면 Ctrl+Shift+B를 눌러 솔루션을 빌드합니다.이렇게 하면 워크플로 디자이너에 표시되는 데 필요한 사용자 지정 작업이 빌드됩니다.

'https://schemas.microsoft.com/workflow/2012/xaml/activities' 네임스페이스에서 'DynamicValue' 형식을 찾을 수 없습니다.

샘플과 최신 버전의 Visual Studio 2012용 Workflow Manager Tools 1.0이 일치하지 않아 이러한 오류가 발생할 수 있습니다.이 문제를 해결하려면 먼저 Workflow Manager Tools를 통해 최신 버전의 Visual Studio 2012용 워크플로 관리자 1.0 설치이 설치되었는지 확인하고 XAML 파일에서 다음 줄의 모든 인스턴스를 그 다음 줄로 바꿉니다.

바꾸기:

xmlns:p="https://schemas.microsoft.com/workflow/2012/xaml/activities"

대상:

xmlns:p="https://schemas.microsoft.com/workflow/2012/07/xaml/activities"

참고 항목

워크플로 관리자 1.0 시작 자습서