2010-08-18 4 views
4

한 프로젝트에서 WCF 서비스를 노출하고 '서비스 참조 추가'(이 경우 Framework 3.5 WPF 응용 프로그램)를 사용하여 다른 프로젝트에서 사용한다고 가정합니다.WCF 클라이언트 연결 캐싱/풀링

ClientBase 파생 프록시를 다시 인스턴스화 할 때 ClientBase가 기본 채널의 모든 연결 풀링을 수행합니까? 아니면 매번 서비스와의 연결을 위해 전체 오버 헤드가 발생합니까? 저는 wsHttpBinding과 함께 보안 모드 = "Message"를 사용하고 있기 때문에 특히 걱정됩니다.

답변

7

클라이언트 프록시를 캐시하는 방법에 대한 모범 사례를 설명하는 this article을 살펴보십시오. 프록시를 직접 생성하는 경우 (MyProxy p = new MyProxy(...)) 비싼 부분 인 기본 ChannelFactory를 실제로 캐시 할 수없는 것으로 보입니다. 그러나 ChannelFactory을 사용하여 프록시를 만드는 경우 ChannelFactory은 AppDomain 수준에서 프록시에 의해 캐시되며 프록시에 전달하는 매개 변수 (연결 문자열을 기반으로하는 연결 풀링과 같은 종류)를 기반으로합니다.

이 기사에서는 내용을 자세히 설명하지만 ChannelFactory을 사용하여 프록시를 직접 인스턴스화하는 대신 성능을 향상시키는 것이 주요 포인트입니다.

희망이 도움이됩니다!

+0

기사에서 말하지 않는 내용 : 바인딩에 따라 프록시 시간이 초과되었습니다! WSHttpBinding의 경우 기본 시간 초과는 10 분입니다. – Alex

+0

wsHttpBinding에서 estabilishSecurityContext = false 및 negotiateServiceCredential = false를 설정하는 것을 잊지 마십시오. –

1

This article에는 예, WCF에 대한 TCP 연결 풀링이 있음을 설명합니다. 그것이 설명 할 수없는 것은 효과가있는 경우입니다. 내가 말할 수있는 한, 명명 된 엔드 포인트 (사용자 정의 Binding 오브젝트를 사용하지 않는 IE)를 제공하여 프록시 오브젝트를 구성하는 한 연결 풀링이 작동합니다. 내 웹 응용 프로그램에서로드를 던지고 열려있는 TCP 연결을 확인하여 이것을 netstat으로 테스트했습니다.

그러나 결론은 TCP 연결을 다시 사용하기 위해 프록시 개체를 캐시 할 필요가 없다는 것입니다.

+2

따라서 엔드 포인트 이름으로 연결 풀링을 수행하면 해당 이벤트에서 채널 팩토리의 CreateChannel() 메소드가 매우 빠름을 의미합니까? 매번 ChannelFactory를 새로 만드는 것은 어떨까요? –