애플리케이션은 WCF(Windows Communication Foundation) 클라이언트 개체를 사용하여 서비스 작업을 호출합니다. 이 항목에서는 WCF 클라이언트 개체, WCF 클라이언트 채널 및 기본 채널 아키텍처와의 관계에 대해 설명합니다. WCF 클라이언트 개체에 대한 기본 개요는 WCF 클라이언트 개요를 참조하세요. 채널 계층에 대한 자세한 내용은 채널 계층 확장을 참조하세요.
개요
서비스 모델 런타임은 다음으로 구성된 WCF 클라이언트를 만듭니다.
애플리케이션 코드의 호출을 보내는 메시지로 변환하고 응답 메시지를 출력 매개 변수로 변환하고 애플리케이션에서 검색할 수 있는 값을 반환하는 서비스 계약의 자동으로 생성된 클라이언트 구현입니다.
다양한 인터페이스를 그룹화하고 제어 기능에 대한 액세스를 제공하는 컨트롤 인터페이스(System.ServiceModel.IClientChannel)의 구현입니다. 특히 클라이언트 세션을 닫고 채널을 삭제하는 기능입니다.
사용된 바인딩에서 지정한 구성 설정에 따라 빌드되는 클라이언트 채널입니다.
애플리케이션은 System.ServiceModel.ChannelFactory에서 ClientBase<TChannel> 생성할 때 파생 클래스의 인스턴스를 만들거나 요청 시 이러한 클라이언트를 만들 수 있습니다. 이 사전 빌드된 클라이언트 클래스는 ChannelFactory에 의해 동적으로 생성되는 클라이언트 채널 구현을 캡슐화하고 이에 위임합니다. 따라서 클라이언트 채널과 이를 생성하는 채널 팩터리는 이 논의의 초점입니다.
클라이언트 개체 및 클라이언트 채널
WCF 클라이언트의 기본 인터페이스는 System.ServiceModel.IClientChannel 핵심 클라이언트 기능뿐만 아니라 기본 통신 개체 기능, 컨텍스트 기능 System.ServiceModel.ICommunicationObjectSystem.ServiceModel.IContextChannel및 확장 가능한 동작System.ServiceModel.IExtensibleObject<T>을 노출하는 인터페이스입니다.
그러나 인터페이스는 IClientChannel 서비스 계약 자체를 정의하지 않습니다. 서비스 계약 인터페이스(일반적으로 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)와 같은 도구를 사용하여 서비스 메타데이터에서 생성됨)에 의해 선언됩니다. WCF 클라이언트 유형은 애플리케이션이 작업을 직접 호출하고 클라이언트 측 런타임 기능을 사용할 수 있도록 IClientChannel과 대상 서비스 계약 인터페이스를 확장합니다. WCF 클라이언트를 만들면 구성된 서비스 엔드포인트에 연결하고 상호 작용할 수 있는 런타임을 만드는 데 필요한 정보를 WCFSystem.ServiceModel.ChannelFactory 개체에 제공합니다.
앞에서 설명한 것처럼 두 WCF 클라이언트 형식을 사용하려면 먼저 구성해야 합니다. 가장 간단한 WCF 클라이언트 형식은 파생된 ClientBase<TChannel> 개체입니다(또는 DuplexClientBase<TChannel> 서비스 계약이 이중 계약인 경우). 생성자를 사용하거나 프로그래밍 방식으로 구성하거나 구성 파일을 사용하여 이러한 형식을 만든 다음 서비스 작업을 호출하기 위해 직접 호출할 수 있습니다. 개체에 대한 ClientBase<TChannel> 기본 개요는 WCF 클라이언트 개요를 참조하세요.
두 번째 형식은 메서드 호출에 의해 런타임에 생성됩니다. 통신 세부 사항의 엄격한 제어와 관련된 애플리케이션은 기본 클라이언트 런타임 및 채널 시스템보다 더 직접적인 상호 작용을 가능하게 하므로 일반적으로 클라이언트 채널 개체라고 하는 이 클라이언트 형식을 사용합니다.
채널 팩터리
클라이언트 호출을 지원하는 기본 런타임을 만드는 클래스는 클래스입니다 System.ServiceModel.ChannelFactory<TChannel> . WCF 클라이언트 개체와 WCF 클라이언트 채널 개체는 모두 ChannelFactory<TChannel> 개체를 사용하여 인스턴스를 만듭니다. 파생된 클라이언트 개체는 채널 팩터리의 처리를 캡슐화하지만, 몇몇 시나리오에서는 채널 팩터리를 직접 사용하는 것이 충분히 합리적입니다. 일반적인 시나리오는 기존 팩터리에서 새 클라이언트 채널을 반복적으로 만들려는 경우입니다. 클라이언트 개체를 사용하는 경우 속성을 호출하여 WCF 클라이언트 개체에서 기본 채널 팩터리를 ClientBase<TChannel>.ChannelFactory 가져올 수 있습니다.
채널 팩터리에 대해 기억해야 할 중요한 점은 호출 ChannelFactory<TChannel>.CreateChannel하기 전에 제공된 구성에 대한 클라이언트 채널의 새 인스턴스를 만드는 것입니다. WCF 클라이언트 개체에서 CreateChannel(또는 ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel, 또는 다른 모든 작업)을 호출한 후에는, 대상 엔드포인트 주소를 변경하더라도 채널 팩터리를 수정하여 다른 서비스 인스턴스로의 채널을 기대할 수 없습니다. 다른 구성으로 클라이언트 개체 또는 클라이언트 채널을 만들려면 먼저 새 채널 팩터리를 만들어야 합니다.
WCF 클라이언트 개체 및 WCF 클라이언트 채널을 사용하는 다양한 문제에 대한 자세한 내용은 WCF 클라이언트를 사용하여 서비스에 액세스하는 것을 참조하세요.
다음 두 섹션에서는 WCF 클라이언트 채널 개체의 생성 및 사용에 대해 설명합니다.
새 WCF 클라이언트 채널 개체 만들기
클라이언트 채널의 사용을 설명하기 위해 다음 서비스 계약이 생성되었다고 가정합니다.
[System.ServiceModel.ServiceContractAttribute(
Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
[System.ServiceModel.OperationContractAttribute(
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
typeof(microsoft.wcf.documentation.SampleFault),
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);
}
서비스에 연결 ISampleService
하려면 생성된 계약 인터페이스를 채널 팩터리(ChannelFactory<TChannel>)와 직접 사용하여 연결합니다. 특정 계약에 대한 채널 팩터리를 만들고 구성한 후에는 CreateChannel 메서드를 호출하여 서비스와 통신하는 데 사용할 수 있는 클라이언트 채널 개체를 반환받을 수 있습니다.
서비스 계약 인터페이스를 사용하는 ChannelFactory<TChannel> 클래스를 사용할 때, 채널을 명시적으로 열거나 닫거나 중단하려면 IClientChannel 인터페이스로 캐스트해야 합니다. 더 쉽게 작업할 수 있도록 Svcutil.exe 도구는 서비스 계약 인터페이스를 모두 구현하고 캐스팅하지 않고도 클라이언트 채널 인프라와 IClientChannel 상호 작용할 수 있도록 하는 도우미 인터페이스를 생성합니다. 다음 코드는 이전 서비스 계약을 구현하는 도우미 클라이언트 채널의 정의를 보여 줍니다.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}
새 WCF 클라이언트 채널 개체 만들기
클라이언트 채널을 사용하여 서비스에 연결 ISampleService
하려면 생성된 계약 인터페이스(또는 도우미 버전)를 채널 팩터리에서 직접 사용하여 계약 인터페이스의 형식을 형식 매개 변수로 전달합니다. 특정 계약에 대한 채널 팩터리를 만들고 구성한 후에는 서비스와 통신하는 데 사용할 수 있는 클라이언트 채널 개체를 반환하는 메서드를 ChannelFactory<TChannel>.CreateChannel 호출 ISampleService
할 수 있습니다.
생성되면 클라이언트 채널 개체는 IClientChannel와 계약 인터페이스를 구현합니다. 따라서 직접 사용하여 해당 계약을 지원하는 서비스와 상호 작용하는 작업을 호출할 수 있습니다.
클라이언트 개체와 클라이언트 채널 개체 사용의 차이점은 개발자를 위한 제어 및 사용 편의성 중 하나일 뿐입니다. 클래스 및 개체를 사용하는 데 익숙한 많은 개발자는 WCF 클라이언트 채널 대신 WCF 클라이언트 개체를 사용하는 것을 선호합니다.
예를 들어, ChannelFactory 사용 방법을 참조하세요.