서비스 호스트

서비스 호스트는 프로세스 내에서 서비스를 호스팅하기 위한 런타임 환경입니다.

서비스는 서비스 호스트 내에서 하나 이상의 엔드포인트를 구성할 수 있습니다.

서비스 엔드포인트를 포함하는 서비스 호스트의 구조를 보여 주는 다이어그램

서비스 호스트 만들기

서비스 호스트를 만들기 전에 서비스는 엔드포인트를 정의해야 합니다. 서비스 호스트의 엔드포인트는 WS_SERVICE_ENDPOINT 구조에 지정되며 다음 정보로 정의됩니다.

WS_SERVICE_ENDPOINT serviceEndpoint = {0};
const WS_SERVICE_ENDPOINT* serviceEndpoints[1];
serviceEndpoints[0] = &serviceEndpoint;
WS_STRING url = WS_STRING_VALUE(L"net.tcp://+/Example");

// Method based service contract for the service
static WS_SERVICE_CONTRACT calculatorContract = 
{
    &calculatorContractDescription, // comes from a generated header.
    NULL,
    &calculatorFunctions, // specified by the application
};

serviceEndpoint.address.url = &url;
serviceEndpoint.binding.channelBinding =  WS_TCP_CHANNEL_BINDING; 
serviceEndpoint.contract = &calculatorContract;  
serviceEndpoint.channelType = WS_CHANNEL_TYPE_DUPLEX_SESSION; 
serviceEndpoint.authorizationCallback = AuthorizationCallback; // Authorization callback.

UDP를 통해 SOAP에 대해 단방향 계약만 지원되며 WS_CHANNEL_BINDING 열거형의 WS_UDP_CHANNEL_BINDING 표시됩니다.

엔드포인트가 정의되면 WsCreateServiceHost 함수로 전달될 수 있습니다. 이 함수는 WS_SERVICE_ENDPOINT 구조체에 대한 포인터 배열을 사용합니다.

HRESULT hr = WsCreateServiceHost (serviceEndpoints, 1, NULL, 0, &host, error);

애플리케이션은 필요에 따라 WsCreateServiceHost서비스 속성 배열을 제공하여 서비스 호스트에서 사용자 지정 설정을 구성할 수 있습니다.

애플리케이션이 서비스 호스트를 열어 클라이언트 요청 수락을 시작합니다.

WsOpenServiceHost(serviceHost, NULL, NULL);

서비스 호스트를 연 후 필요한 작업이 더 이상 없으면 애플리케이션에서 닫을 수 있습니다. 이렇게 하면 리소스가 해제되지 않으며 WsResetServiceHost에 대한 후속 호출을 통해 다시 열 수 있습니다.

WsCloseServiceHost(serviceHost, NULL, NULL);

서비스 호스트를 닫은 후 애플리케이션이 다시 사용할 서비스 호스트를 다시 설정할 수 있습니다.

WsResetServiceHost(serviceHost, NULL);

애플리케이션이 서비스 호스트로 완료되면 WsFreeServiceHost 함수를 호출하여 서비스 호스트와 연결된 리소스를 해제할 수 있습니다. 이 함수를 호출하기 전에 WsCloseServiceHost 를 호출해야 합니다.

WsFreeServiceHost(serviceHost, NULL);

서비스 호스트에 사용자 지정 상태를 연결하는 방법에 대한 자세한 내용은 사용자 호스트 상태를 참조하세요.

지정된 엔드포인트에 대한 서비스 호스트의 권한 부여에 대한 자세한 내용은 서비스 권한 부여를 참조하세요.

서비스에 대한 서비스 작업 및 서비스 계약 구현에 대한 자세한 내용은 서비스 작업서비스 계약topics을 참조하세요.

보안

애플리케이션은 다음 속성을 사용하여 서비스 호스트가 애플리케이션을 대신하여 할당하는 리소스의 양을 제어할 수 있습니다.

보안 기본값은 이러한 각 속성에 대해 선택되며, 애플리케이션은 이러한 속성을 수정하려는 경우 주의해야 합니다. 위에서 언급한 속성 외에도 채널, 수신기메시지 관련 속성을 애플리케이션에서 수정할 수도 있습니다. 이러한 설정을 수정하기 전에 이러한 구성 요소의 보안 고려 사항을 참조하세요.

또한 WWSAPI 서비스 호스트 API를 사용할 때 다음 애플리케이션 디자인 고려 사항을 신중하게 평가해야 합니다.

  • MEX를 사용하는 경우 애플리케이션은 중요한 데이터를 공개하지 않도록 주의해야 합니다. 완화를 위해 MEX를 통해 노출되는 데이터의 특성이 중요한 경우 애플리케이션은 최소한 인증이 필요한 보안 바인딩으로 MEX 엔드포인트를 구성하고 WS_SERVICE_SECURITY_CALLBACK 사용하여 엔드포인트의 일부로 권한 부여를 구현하도록 선택할 수 있습니다.
  • 기본적으로 오류를 통한 풍부한 오류 정보는 WS_SERVICE_PROPERTY_FAULT_DISCLOSURE 속성에 의해 서비스 호스트에서 사용하지 않도록 설정됩니다. 오류의 일부로 풍부한 오류 정보를 보내는 것은 애플리케이션의 재량에 따라 결정됩니다. 그러나 이로 인해 정보가 공개되어 디버깅 시나리오에 대해서만 이 설정을 변경하는 것이 좋습니다.
  • 서비스 호스트는 기본 프로필 2.0 및 XML serialization에 대해 수행된 유효성 검사 외에도 서비스 작업 매개 변수의 일부로 수신된 데이터 콘텐츠에 대한 유효성 검사를 수행하지 않습니다. 모든 매개 변수 유효성 검사를 자체적으로 수행하는 것은 애플리케이션의 책임입니다.
  • 권한 부여는 서비스 호스트의 일부로 구현되지 않습니다. 그러나 애플리케이션은 WS_SECURITY_DESCRIPTION 및 WS_SERVICE_SECURITY_CALLBACK 사용하여 자체 권한 부여 체계를 구현할 수 있습니다.
  • 애플리케이션이 엔드포인트에서 보안 바인딩을 사용하는 것은 애플리케이션의 책임입니다. 서비스 호스트는 엔드포인트에 구성된 것 이외의 보안을 제공하지 않습니다.

다음 API 요소는 서비스 호스트와 함께 사용됩니다.

콜백 설명
WS_SERVICE_ACCEPT_CHANNEL_CALLBACK 서비스 호스트가 엔드포인트 수신기에서 채널을 수락할 때 호출됩니다.
WS_SERVICE_CLOSE_CHANNEL_CALLBACK 채널이 닫혀 있거나 엔드포인트에서 중단될 때 호출됩니다.

 

열거형 설명
WS_SERVICE_ENDPOINT_PROPERTY_ID WS_SERVICE_ENDPOINT 구성하기 위한 선택적 매개 변수입니다.
WS_SERVICE_HOST_STATE 서비스 호스트가 있을 수 있는 상태입니다.
WS_SERVICE_PROPERTY_ID 서비스 호스트를 구성하기 위한 선택적 매개 변수입니다.

 

함수 Description
WsAbortServiceHost 서비스 호스트에서 현재 작업을 중단하고 중단합니다.
WsCloseServiceHost 클라이언트에서 새 채널이 허용되지 않도록 모든 수신기를 닫습니다.
WsCreateServiceHost 서비스 호스트를 만듭니다.
WsFreeServiceHost 서비스 호스트 개체와 연결된 메모리를 해제합니다.
WsGetServiceHostProperty 지정된 서비스 호스트 속성을 검색합니다.
WsOpenServiceHost 통신을 위한 서비스 호스트를 열고 모든 엔드포인트에서 수신기를 시작합니다.
WsResetServiceHost 재사용을 위해 서비스 호스트를 다시 설정하며 다시 사용할 기본 채널 및 수신기를 다시 설정합니다.

 

Handle 설명
WS_SERVICE_HOST 서비스 호스트를 참조하는 데 사용되는 불투명 형식입니다.

 

구조체 설명
WS_SERVICE_ENDPOINT 서비스 호스트의 개별 엔드포인트를 나타냅니다.
WS_SERVICE_ENDPOINT_PROPERTY 서비스별 설정을 지정합니다.
WS_SERVICE_PROPERTY 서비스별 설정을 지정합니다.
WS_SERVICE_PROPERTY_ACCEPT_CALLBACK 채널이 성공적으로 수락될 때 호출되는 콜백을 지정합니다.
WS_SERVICE_PROPERTY_CLOSE_CALLBACK 채널을 닫을 때 호출되는 콜백을 지정합니다.