문제

WCF 서비스를 소비하고 VS 2008 서비스 참조를 사용하여 프록시를 만들었습니다.

WCF 서비스 방법을 호출하는 가장 좋은 패턴을 찾고 있습니다.

  • 서비스 메소드를 호출 할 때마다 클라이언트 프록시 인스턴스를 만들고 그 일을 끝내 자마자 클라이언트를 닫아야합니까? 클라이언트 응용 프로그램을 프로파일 링했을 때 프록시 클라이언트를 초기화하는 동안 채널을 얻는 데 많은 시간이 걸리는 것을 알 수 있습니다.
  • 클라이언트 프록시에 싱글 톤 패턴을 사용하여 한 번만 인스턴스를 사용하고 재 입력 오버 헤드를 제거 할 수 있습니까? 이 접근법에 숨겨진 문제가 있습니까?

적은 사용자 정의로 .NET Framework 3.5 SP1, BasICHTTP 바인딩을 사용하고 있습니다.

도움이 되었습니까?

해결책

때에 따라 다르지 ;-)

앱에 여러 통화가 필요한 시퀀스가있는 경우 프록시 클라이언트에 매달려 추가 호출을 위해 계속 사용할 수 있습니다. "결함"상태를 확인하라는 경고를 받으십시오. 서버에서 오류가 발생하면 클라이언트 프록시와 서버 간의 채널이 "결함"될 수 있으므로 클라이언트 프록시를 사용할 수 없습니다.

또한 - 비싼 부분은 ChannelFactory<T> - 코드에서 클라이언트 proyx를 만들 때이 두 단계를 분리하려고 시도 할 수 있습니다.

ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();

그 채널 공장에 매달려, 예를 들어 어딘가에 캐시

두 번째 단계는 시간과 마력 측면에서 훨씬 덜 집중적이어야합니다.

IYourService client = factory.CreateChannel();

모든 통화 (또는 호출 시퀀스) 전에이 단계를 수행 할 수 있으며 실제로 그로부터 나쁜 성능을 얻지 못해서는 안됩니다.

가능할 때마다 싱글 톤을 피하는 것이 좋습니다. 벌레 캔을 여는 것과 같습니다. 절대적으로 당신이 절대적으로하지 않는 한 (예 : 한 번에 한 발신자에게만 사용할 수있는 단일 리소스에 대한 액세스를 관리해야 함)

마크

다른 팁

오래된 질문을 시작해서 죄송하지만, 쉽게 참조 할 수 있도록 이것을 추가하고 싶었습니다.

나는 marc_s 및 rally25R에 전적으로 동의합니다. 따라서 시작할뿐만 아니라 결함 상태를 처리하는 프록시 또는 래퍼를 사용하는 것을 고려하십시오. 여기 질문이 있습니다 따라서 일부 솔루션에 대해 논의하고 여기 또 다른 것이 있습니다 Corneliu가 인터넷에서 발견 한 좋은 솔루션. "재사용 가능한 클라이언트베이스 프록시 구축"그의 솔루션은 편의와 성능을 극대화하기 위해 서비스 방법을 노출시키는 래퍼를 생성합니다. 여전히 작동하는지 테스트해야합니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top