다음을 통해 공유


COM+ Integration: COM+ Hosted

이 샘플에서는 COM+ 응용 프로그램에서 인터페이스를 WCF(Windows Communication Foundation) 서비스로 노출하는 방법과 WCF 클라이언트에서 이를 호출하는 방법을 보여 줍니다. 이 샘플은 클라이언트 콘솔 프로그램(.exe)과 COM+ 내에서 등록된 엔터프라이즈 서비스 라이브러리 응용 프로그램(.dll)으로 구성됩니다. 이 샘플은 계산기 서비스를 구현하는 Getting Started 샘플 샘플을 기반으로 하며 COM+ Integration: Web-Hosted 샘플과 비슷합니다. COM+ 호스팅과 TCP 전송을 사용하여 이 샘플은 COM+ Integration: Web-Hosted 샘플보다 향상된 성능의 접근 방법을 보여 주지만 COM+ 응용 프로그램을 명시적으로 활성화할 필요 없이 요청을 처리할 수 있습니다.

참고

이 샘플의 설치 절차 및 빌드 지침은 이 항목의 끝부분에 나와 있습니다.

엔터프라이즈 서비스 응용 프로그램에는 수학 메서드(Add, Subtract, Multiply 및 Divide)를 노출하는 단일 ICalculator 인터페이스를 구현하는 단일 구성 요소가 포함되어 있습니다.

// Define the component's interface.
public interface ICalculator
{
    double Add(double n1, double n2);
    double Subtract(double n1, double n2);
    double Multiply(double n1, double n2);
    double Divide(double n1, double n2);
}

이 인터페이스는 요청-회신 통신 패턴을 정의하는 서비스 계약으로 노출됩니다. 클라이언트에서 수학 연산을 동기적으로 요청하면 서비스와 기본 구성 요소에서 결과로 회신합니다. 콘솔 창에는 클라이언트 동작이 표시됩니다.

서비스는 COM+와 in-process로 호스팅되고 응용 프로그램 ServiceModelHostedSample은 서비스 끝점을 활성화하기 위해 수동으로 시작해야 합니다. ESCalculatorService 클래스 구현은 해당 결과를 계산하여 반환합니다.

// Supporting implementation for the ICalculator interface.
public class ESCalculatorService : ServicedComponent, ICalculator
{
    public double Add(double n1, double n2)
    {
        return n1 + n2;
    }
    public double Subtract(double n1, double n2)
    {
        return n1 - n2;
    }
    public double Multiply(double n1, double n2)
    {
        return n1 * n2;
    }
    public double Divide(double n1, double n2)
    {
        return n1 / n2;
    }
}

참고

이 클래스는 ServiceModel 관련 코드를 포함하지 않으며 서명되어 GAC(전역 어셈블리 캐시)에 추가되는 엔터프라이즈 서비스 특성으로 특정이 지정된 일반 엔터프라이즈 서비스 어셈블리입니다.

COM+ Service Model Configuration Tool (ComSvcConfig.exe)는 선택한 인터페이스에 대한 지원 서비스를 추가하는 데 사용됩니다. 이를 수행하기 위해 다음 코드가 사용됩니다.

ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose

이 경우에 ServiceModelHostedSample 응용 프로그램 내에 있는 ServiceModelHostedSample.ESCalculator 구성 요소의 ICalculator 인터페이스에 대한 서비스를 이 도구에서 추가합니다. 서비스는 메타데이터 교환 끝점과 함께 COM+ 내에서 호스팅됩니다. 통합이 용이하도록 ServiceModelInitializer 구성 요소가 응용 프로그램에 추가되고 COM+ 응용 프로그램의 응용 프로그램 루트 디렉터리(이 응용 프로그램의 경우에는 "%PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\")에서 응용 프로그램 구성 파일이 생성됩니다. 응용 프로그램 시작 시에 ServiceModelInitializer 구성 요소는 응용 프로그램 구성 파일을 검사하고 적절하게 구성된 서비스 끝점을 시작합니다.

COM+ 호스팅 서비스의 경우 COM+ Service Model Configuration Tool (ComSvcConfig.exe) 도구는 동일한 컴퓨터 액세스만 제공하는 netNamedPipeBinding을 사용하여 서비스 끝점을 만듭니다. 다른 전송에서 끝점을 제공하기 위해 구성 파일을 추가로 편집해야 합니다. 이 샘플에서는 netTcpBinding 및 wsHttpBinding 바인딩을 통해 TCP 및 HTTP에서 응용 프로그램 노출하는 사용자 지정 구성 파일을 사용합니다.

<!-- Specify the service (application and component GUIDs) and service and MEX endpoints -->
<services>
  <service behaviorConfiguration="ComServiceMexBehavior"
           name="{4CDCDB2C-0B19-4534-95CD-FBBFF4D67DD9},{C2B84940-AD54-4A44-B5F7-928130980AB9}">
    <endpoint
           address="ICalculator"
           binding="netTcpBinding"
           bindingConfiguration="comNonTransactionalBinding"
           contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
    <endpoint
           address="ICalculator"
           binding="wsHttpBinding"
           bindingConfiguration="comNonTransactionalBinding"
           contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
    <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange" />
    <host>
      <!-- Specify base addresses for both transports -->
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8081/ServiceModelHostedSample" />
        <add baseAddress="https://localhost:8082/ServiceModelHostedSample" />
      </baseAddresses>
    </host>
  </service>
</services>

또한 이 샘플에서 구성 파일은 서비스의 이름과 네임스페이스를 사용자 지정하며 구성 요소가 제공하는 작업의 하위 집합만 노출하는 데 사용될 수 있습니다. 이 경우 Divide 메서드는 주석 처리되었으며 노출된 서비스 계약에서 생략됩니다.

<!-- comContract specifying the name, namespace and methods for the service -->
<comContracts>
  <comContract
      contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}"
      name="ICalculator"
      namespace="https://microsoft.com/Microsoft.ServiceModel.Samples/EnterpriseServicesHosted"
      requiresSession="true">
    <exposedMethods>
      <add exposedMethod="Add" />
      <add exposedMethod="Subtract" />
      <add exposedMethod="Multiply" />
      <!-- <add exposedMethod="Divide" /> -->
    </exposedMethods>
  </comContract>
</comContracts>

클라이언트는 Service Metadata Utility Tool (Svcutil.exe)에 의해 생성된 클라이언트를 사용하여 계약에서 통신합니다. 클라이언트는 App.config의 호환되는 구성을 가진 generatedClient.cs 파일에 포함됩니다. 이 유틸리티는 서비스에 대한 메타데이터를 검색하고 계약 형식에서 통신하는 데 사용되는 클라이언트를 생성합니다. 서비스 메타데이터를 검색하는 데 클라이언트 코드가 사용되므로 클라이언트 코드를 생성하기 위해 호스팅된 서비스를 사용할 수 있어야 합니다. 클라이언트 디렉터리의 명령 프롬프트에서 다음 명령을 실행하여 형식화된 프록시를 생성합니다.

svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8082/ServiceModelHostedSample/mex /out:generatedClient.cs /config:App.config

클라이언트 구현에서는 TCP 바인딩 구성을 사용하여 생성된 클라이언트의 인스턴스를 생성합니다. 그런 다음 이 인스턴스는 서비스와 통신을 시작하는 데 사용됩니다.

// Create a client.
CalculatorClient client = new CalculatorClient("NetTcpBinding_ICalculator ");
WSHttpBinding_ICalculator
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

샘플을 실행하면 작업 요청 및 응답이 클라이언트 콘솔 창에 표시됩니다. 이를 통해 WCF 클라이언트에서 생성된 WCF 서비스가 사용되는 것을 볼 수 있습니다. 클라이언트를 종료하려면 클라이언트 창에서 Enter 키를 누릅니다.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25

Press <ENTER> to terminate client.

샘플을 설치하고 빌드하려면

  1. Windows Communication Foundation 샘플의 일회 설치 절차를 수행했는지 확인합니다.

  2. C# 또는 Visual Basic .NET 버전의 솔루션을 빌드하려면 Windows Communication Foundation 샘플 빌드의 지침을 따릅니다. 빌드 프로세스에서는 COM+ 응용 프로그램을 만들어 "유휴 상태일 때도 실행"으로 표시하는 스크립트를 실행합니다. 이렇게 하면 서비스 끝점이 비활성 상태로 인해 자동으로 종료하는 것을 방지할 수 있습니다.

  3. 명령 프롬프트에서 샘플의 service\bin 폴더로 이동합니다. Windows Vista 또는 Windows Server 2008을 사용할 경우 Administrator로 명령 프롬프트를 실행해야 합니다.

  4. gacutil.exe /i ESCalculatorHosted.dll을 입력하여 어셈블리를 GAC(전역 어셈블리 캐시)에 추가합니다. Gacutil.exe가 경로에 있는지 확인합니다.

  5. regsvcs.exe ESCalculatorHosted.dll을 입력하여 어셈블리의 구성 요소와 ServiceModelSample 응용 프로그램을 COM+에 등록합니다. Regsvcs.exe가 경로에 있는지 확인합니다.

  6. ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose를 입력하여 인터페이스를 IIS(인터넷 정보 서비스)에서 호스팅되는 서비스로 노출합니다. ComSvcConfig.exe가 경로에 있는지 확인합니다.

  7. 기본 구성을 이 샘플의 사용자 지정 구성으로 바꾸려면 Service/application.config 파일을 %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ 디렉터리에 복사합니다.

단일 컴퓨터 구성에서 샘플을 실행하려면

  1. 구성 요소 서비스 관리 콘솔을 사용하여 응용 프로그램과 끝점을 시작하려면 ServiceModelHostedSample을 마우스 오른쪽 단추로 클릭하고 시작을 선택합니다.

  2. https://localhost:8082/ServiceModelHostedSample 주소를 입력하여 브라우저에서 서비스에 액세스할 수 있는지 테스트합니다. 확인 페이지가 응답으로 표시됩니다.

  3. 언어별 폴더의 \client\bin\에서 Client.exe를 실행합니다. 클라이언트 콘솔 창에 클라이언트 동작이 표시됩니다.

  4. 클라이언트와 서비스가 통신할 수 없는 경우 문제 해결 팁을 참조하십시오.

    참고

    샘플에서는 콘솔 응용 프로그램 클라이언트 프로그램을 빌드합니다. 출력을 보려면 명령 프롬프트를 사용하여 샘플을 실행해야 합니다.

다중 컴퓨터 구성에서 샘플을 실행하려면

  1. service\bin 디렉터리의 ESCalculatorHosted.dll 파일과 service 디렉터리의 CreateAppLeaveRunning.vbs 파일을 서비스 컴퓨터의 디렉터리에 복사합니다.

  2. 명령 프롬프트에서 서비스 컴퓨터의 해당 대상 디렉터리로 이동합니다. Windows Vista 또는 Windows Server 2008을 사용할 경우 Administrator로 명령 프롬프트를 실행해야 합니다.

  3. CreateAppLeaveRunning.vbs 스크립트를 실행하여 "유휴 상태일 때도 실행" 설정을 가진 COM+ 응용 프로그램을 만듭니다.

  4. gacutil.exe /i ESCalculatorHosted.dll을 입력하여 어셈블리를 GAC(전역 어셈블리 캐시)에 추가합니다. Gacutil.exe가 경로에 있는지 확인합니다.

  5. regsvcs.exe ESCalculatorHosted.dll을 입력하여 어셈블리의 구성 요소와 ServiceModelSample 응용 프로그램을 COM+에 등록합니다. Regsvcs.exe가 경로에 있는지 확인합니다.

  6. ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose를 입력하여 인터페이스를 IIS에서 호스팅되는 서비스로 노출합니다. ComSvcConfig.exe가 경로에 있는지 확인합니다.

  7. 기본 구성을 이 샘플의 사용자 지정 구성으로 바꾸려면 Service/application.config 파일을 %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ 디렉터리에 복사합니다.

  8. 서비스 응용 프로그램 구성 파일에서 끝점 정의의 주소 값을 서비스의 새 주소와 일치하도록 변경합니다. 주소에서 "localhost"에 대한 참조를 정규화된 도메인 이름으로 바꿉니다.

  9. 구성 요소 서비스 관리 콘솔을 사용하여 응용 프로그램과 끝점을 시작하려면 ServiceModelHostedSample을 마우스 오른쪽 단추로 클릭하고 시작을 선택합니다.

  10. 언어별 폴더의 \client\bin\ 폴더에서 클라이언트 컴퓨터로 클라이언트 프로그램 파일을 복사합니다.

  11. 서비스가 도메인 계정으로 실행 중이 아닌 경우 클라이언트 구성 파일을 열고 끝점 정의의 주소 값을 서비스의 새 주소와 일치하도록 변경합니다. 주소에서 "localhost"에 대한 참조를 정규화된 도메인 이름으로 바꿉니다. 서비스가 도메인 계정으로 실행 중인 경우 서비스에 대해 Svcutil.exe를 실행하여 클라이언트 구성을 다시 생성합니다. 샘플의 구성 파일 대신에 생성된 파일을 사용합니다. 생성된 구성 파일에는 추가 ID 정보가 포함되어 있고 기본 설정이기는 하지만 서비스 끝점에 연결하는 데 필요한 모든 설정이 포함되어 있습니다.

  12. 클라이언트 컴퓨터에서 브라우저를 사용하여 서비스에 액세스할 수 있는지 테스트합니다.

  13. 클라이언트 컴퓨터의 명령 프롬프트에서 Client.exe를 실행합니다.

샘플 실행 후 정리를 수행하려면

  1. 보안을 위해 샘플 사용이 끝나면 전역 어셈블리 캐시에서 ESCalculatorHosted 구성 요소를 제거하고 ServiceModelHostedSample COM+ 응용 프로그램을 삭제하고 응용 프로그램 루트 디렉터리 %PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\를 제거합니다.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.