이중 서비스
이중 서비스 계약은 양쪽 끝점에서 메시지를 다른 사용자에게 독립적으로 전송할 수 있는 메시지 교환 패턴입니다. 따라서 이중 서비스에서는 클라이언트 끝점으로 메시지를 보내 이벤트와 비슷한 동작을 제공할 수 있습니다. 이중 통신은 클라이언트가 서비스에 연결할 때 이루어지며, 서비스에서 클라이언트로 메시지를 다시 보낼 수 있는 채널을 제공합니다. 이중 서비스의 이벤트와 비슷한 동작은 세션 내에서만 작동합니다.
이중 계약을 만들려면 인터페이스 쌍을 만듭니다. 첫 번째는 클라이언트가 호출할 수 있는 작업을 설명하는 서비스 계약 인터페이스입니다. 해당 서비스 계약에서는 System.ServiceModel.ServiceContractAttribute.CallbackContract 속성에 콜백 계약을 지정해야 합니다. 콜백 계약은 서비스가 클라이언트 끝점에서 호출할 수 있는 작업을 정의하는 인터페이스입니다. 시스템이 제공하는 이중 바인딩은 세션을 사용하지만 이중 계약에서는 세션이 필요 없습니다.
다음은 이중 계약의 예제입니다.
CalculatorService
클래스는 기본 ICalculatorDuplex
인터페이스를 구현합니다. 서비스는 PerSession 인스턴스 모드를 사용하여 각 세션의 결과를 유지합니다. Callback
이라는 private 속성이 클라이언트에 대한 콜백 채널에 액세스합니다. 서비스는 다음 샘플 코드에 표시된 것처럼 콜백 인터페이스를 통해 클라이언트에 다시 전송하는 메시지의 콜백을 사용합니다.
클라이언트는 서비스에서 메시지를 수신하기 위해 이중 계약의 콜백 인터페이스를 구현하는 클래스를 제공해야 합니다. 다음 샘플 코드에서는 ICalculatorDuplexCallback
인터페이스를 구현하는 CallbackHandler
클래스를 보여 줍니다.
이중 계약에 대해 생성된 WCF 클라이언트의 경우 생성 시 InstanceContext 클래스를 제공해야 합니다. 이 InstanceContext 클래스는 콜백 인터페이스를 구현하는 개체의 사이트로 사용되고 서비스에서 다시 전송된 메시지를 처리합니다. InstanceContext 클래스는 CallbackHandler
클래스의 인스턴스를 사용하여 생성됩니다. 이 개체는 콜백 인터페이스를 통해 서비스에서 클라이언트로 전송된 메시지를 처리합니다.
서비스의 구성은 세션 통신 및 이중 통신 모두를 지원하는 바인딩을 제공하도록 설정되어야 합니다. wsDualHttpBinding 요소는 세션 통신을 지원하며 각 방향에 대해 하나씩, 이중 HTTP 연결을 제공하여 이중 통신을 허용합니다.
클라이언트의 경우 다음 샘플 구성에 표시된 것처럼 클라이언트에 연결하기 위해 서버가 사용할 수 있는 주소를 구성해야 합니다.
참고
보안 대화를 사용하여 인증할 수 없는 이중이 아닌 클라이언트는 일반적으로 MessageSecurityException을 throw합니다. 그러나 보안 대화를 사용하는 이중 클라이언트가 인증할 수 없는 경우 클라이언트는 대신 TimeoutException을 수신합니다.
WSHttpBinding 요소를 사용하여 클라이언트/서비스를 만들고 클라이언트 콜백 끝점이 없는 경우 다음 오류를 수신합니다.
HTTP could not register URL
htp://+:80/Temporary_Listen_Addresses/<guid> because TCP port 80 is being used by another application.
다음 샘플 코드에서는 코드에서 클라이언트 끝점 주소를 지정하는 방법을 보여 줍니다.
WSDualHttpBinding binding = new WSDualHttpBinding();
EndpointAddress endptadr = new EndpointAddress("https://localhost:12000/DuplexTestUsingCode/Server");
binding.ClientBaseAddress = new Uri("https://localhost:8000/DuplexTestUsingCode/Client/");
다음 샘플 코드에서는 구성에서 클라이언트 끝점 주소를 지정하는 방법을 보여 줍니다.
<client>
<endpoint name ="ServerEndpoint"
address="https://localhost:12000/DuplexTestUsingConfig/Server"
bindingConfiguration="WSDualHttpBinding_IDuplexTest"
binding="wsDualHttpBinding"
contract="IDuplexTest" />
</client>
<bindings>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IDuplexTest"
clientBaseAddress="https://localhost:8000/myClient/" >
<security mode="None"/>
</binding>
</wsDualHttpBinding>
</bindings>
참고 항목
작업
방법: 채널 팩터리를 만들어 채널을 만들고 관리하는 데 사용