서비스 호스트
서비스 호스트는 프로세스 내에서 서비스를 호스팅하기 위한 런타임 환경입니다.
서비스는 서비스 호스트 내에서 하나 이상의 엔드포인트를 구성할 수 있습니다.
서비스 호스트를 만들기 전에 서비스는 엔드포인트를 정의해야 합니다. 서비스 호스트의 엔드포인트는 WS_SERVICE_ENDPOINT 구조에 지정되며 다음 정보로 정의됩니다.
- 서비스가 호스트되는 실제 URI인 주소입니다.
- 엔드포인트에 대한 기본 채널의 형식을 지정하는 WS_CHANNEL_TYPE 구조체입니다.
- 채널의 바인딩을 지정하는 WS_CHANNEL_BINDING 구조체입니다.
- 엔드포인트에 대한 보안 설명을 포함하는 WS_SECURITY_DESCRIPTION 구조체입니다.
- 엔드포인트에 대한 서비스 계약을 나타내는 WS_SERVICE_CONTRACT 구조체입니다.
- 엔드포인트에 대한 권한 부여 콜백 함수를 지정하는 WS_SERVICE_SECURITY_CALLBACK 구조체입니다.
- 서비스 엔드포인트 속성의 배열을 포함하는 WS_SERVICE_ENDPOINT_PROPERTY 구조체입니다.
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을 참조하세요.
애플리케이션은 다음 속성을 사용하여 서비스 호스트가 애플리케이션을 대신하여 할당하는 리소스의 양을 제어할 수 있습니다.
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_ACCEPTING_CHANNELS
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CONCURRENCY
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CHANNELS
- WS_SERVICE_ENDPOINT_PROPERTY_BODY_HEAP_MAX_SIZE
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CALL_POOL_SIZE
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CHANNEL_POOL_SIZE.
보안 기본값은 이러한 각 속성에 대해 선택되며, 애플리케이션은 이러한 속성을 수정하려는 경우 주의해야 합니다. 위에서 언급한 속성 외에도 채널, 수신기 및 메시지 관련 속성을 애플리케이션에서 수정할 수도 있습니다. 이러한 설정을 수정하기 전에 이러한 구성 요소의 보안 고려 사항을 참조하세요.
또한 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 | 채널을 닫을 때 호출되는 콜백을 지정합니다. |