WCF 서비스에 대한 서비스 프록시 수동 만들기
WCF(Windows Communication Foundation) 서비스에 대한 클라이언트 서비스 프록시를 만드는 가장 쉬운 방법은 클라이언트 만들기 항목에 설명된 대로 WsUtil 도구를 사용하여 서비스 모델 계층에 있습니다. 그러나 필요한 경우 서비스 프록시를 수동으로 만들 수도 있습니다. 이 API에는 WCF와 상호 운용하는 데 필요한 속성을 설정하기 위한 구조, 열거형 등과 함께 서비스 프록시를 만들기 위한 WsCreateServiceProxy 함수가 포함되어 있습니다.
WCF는 각각 특정 사용 시나리오를 대상으로 하는 여러 표준 바인딩을 제공합니다. 연결하려는 서비스를 사용하려는 바인딩은 서비스와 통신하기 위해 서비스 프록시에 대해 사용자 지정해야 하는 채널 속성을 결정합니다.
WCF의 WSHttpBinding에 대한 서비스 프록시 만들기
WSHttpBinding은 기본라인 인터넷 웹 서비스 시나리오용입니다. 최신 SOAP 버전 1.2 및 WS-Addressing 버전 1.0을 사용하며 공용 HTTP 및 HTTPS 전송을 통해 광범위한 보안 설정을 사용하도록 설정합니다. WWSAPI는 WSHttpBinding(또는 해당 문제에 대한 WCF 표준 바인딩)과 동일하지 않지만 기본 SOAP 버전, WS-Addressing 버전 및 인코딩 형식이 WSHttpBinding의 형식과 일치하므로 WSHttpBinding을 사용하는 서비스에 대한 서비스 프록시를 만드는 것은 간단합니다. 예를 들어 보안 없이 WSHttpBinding 엔드포인트와 통신하는 서비스 프록시를 만들려면 다음 코드 조각과 같은 코드를 사용하면 됩니다(변수 선언 및 힙 및 오류 생성은 생략됨). WsCreateServiceProxy 함수 호출에는 채널 속성이나 보안 설명이 지정되지 않습니다.
// Create the proxy
hr = WsCreateServiceProxy(
WS_CHANNEL_TYPE_REQUEST,
WS_HTTP_CHANNEL_BINDING,
NULL, // security description
NULL, // proxy properties
0, // proxy property count
NULL, // channel properties
0, // channel property count
&proxy,
error);
함수는 서비스 프록시를 만들고 serviceProxy 매개 변수(위의 함수 호출에서 프록시)에 대한 포인터를 반환합니다.
WCF의 BasicHttpBinding에 대한 서비스 프록시 만들기
그러나 BasicHttpBinding 바인딩을 사용하는 WCF 서비스에 대한 서비스 프록시를 수동으로 만드는 경우 채널의 SOAP 버전 및 WS-Addressing 속성을 설정해야 합니다. 이는 WWSAPI가 SOAP 버전 1.2 및 WS-Addressing 1.0으로 기본 설정되었기 때문입니다. 반면에 WCF의 BasicHttpBinding은 SOAP 버전 1.1 및 WS-Addressing을 사용하지 않습니다.
채널의 SOAP 버전 및 WS-Addrssing 속성을 설정하려면 채널 속성 및 관련 정보를 포함하도록 WS_CHANNEL_PROPERTY 구조의 배열을 선언합니다.
WS_CHANNEL_PROPERTY channelProperties[4]; // Array to hold up to 4 channel properties
ULONG channelPropertyCount = 0; // Count of properties set
WS_ENVELOPE_VERSION soapVersion = WS_ENVELOPE_VERSION_SOAP_1_1; // Set required SOAP version
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION; // Type of first channel property
channelProperties[channelPropertyCount].value = &soapVersion; // Address of the SOAP version value
channelProperties[channelPropertyCount].valueSize = sizeof(soapVersion); // Size of the value
channelPropertyCount++; // Increment property count
WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT; // Set required WS-Addressing value
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION; // Type of second channel property
channelProperties[channelPropertyCount].value = &addressingVersion ; // Address of the WS-Addressing value
channelProperties[channelPropertyCount].valueSize = sizeof(addressingVersion ); // Size of the value
channelPropertyCount++; // Increment property count
// add more channel properties here
그런 다음 채널 속성 배열(channelProperties) 및 속성 수(channelPropertyCount)를 WsCreateServiceProxy(또는 채널 계층에서 작업하는 경우 WsCreateChannel)에 전달합니다.
// Create the proxy
hr = WsCreateServiceProxy(
WS_CHANNEL_TYPE_REQUEST,
WS_HTTP_CHANNEL_BINDING,
NULL, // security description
NULL, // proxy properties
0, // proxy property count
channelProperties, // channel properties
channelPropertyCount, // channel property count
&proxy,
error);
속성을 저장하도록 선언한 배열은 WsCreateServiceProxy에 복사되므로 함수를 호출한 직후 속성 배열에 대한 메모리를 해제할 수 있습니다. 또한 위의 코드 조각과 같이 스택에서 메모리를 할당하는 경우 호출 직후 함수에서 반환할 수도 있습니다.
기타 바인딩
또한 WWSAPI는 NetTcpBinding 및 WSFederationHttpBinding과 같은 다른 바인딩을 사용하여 WCF 서비스와 통신하는 서비스 프록시를 만드는 메커니즘을 제공합니다. 이러한 바인딩의 대부분은 보안 설명자와 같은 추가 채널 속성을 설정해야 합니다. 다른 바인딩 을 사용하는 방법을 보여 주는 예제는 Windows 웹 서비스 예제, 섹션, 특히 TCP 채널 계층 예제, HTTP 채널 계층 예제 및 보안 채널 계층 예제 하위 섹션을 참조하세요.