WCF ChannelFactory와 프록시 생성


82

ChannelFactory를 사용하여 호출을 호출 할 수있을 때 WCF 서비스에서 프록시를 생성하는 것을 선호하는 상황이 무엇인지 궁금하십니까?

이렇게하면 서버가 업데이트 될 때 프록시를 생성하고 프록시를 다시 생성하는 것에 대해 걱정할 필요가 없습니다.

감사


항상 ChannelFactory를 사용하십시오. 나는 이것을 충분히 강하게 말할 수 없다.
tom redfern 2018-08-31

답변:


88

WCF 클라이언트를 만드는 세 가지 기본 방법이 있습니다.

  1. Visual Studio에서 프록시를 생성하도록합니다. 이 자동 생성은 WSDL을 읽어 서비스에 연결하는 코드입니다. 어떤 이유로 든 서비스가 변경되면 다시 생성해야합니다. 이것의 가장 큰 장점은 설정이 쉽다는 것입니다. VS에는 마법사가 있으며 모두 자동입니다. 단점은 VS에 의존하여 모든 힘든 작업을 수행하므로 통제력을 잃는다는 것입니다.

  2. ChannelFactory알려진 인터페이스와 함께 사용하십시오 . 이는 서비스 (서비스 계약)를 설명하는 로컬 인터페이스가 있어야합니다. 가장 큰 장점은 변경을 훨씬 더 쉽게 관리 할 수 ​​있다는 것입니다. 변경 사항을 다시 컴파일하고 수정해야하지만 이제 코드를 다시 생성하지 않고 새 인터페이스를 참조합니다. 일반적으로 이것은 서버와 클라이언트를 모두 제어 할 때 사용됩니다. 둘 다 단위 테스트를 위해 훨씬 더 쉽게 조롱 할 수 있기 때문입니다. 그러나 인터페이스는 REST 서비스를 포함하여 모든 서비스에 대해 작성 될 수 있습니다 . 이 Twitter API를 살펴보십시오 .

  3. 자신의 프록시 쓰기 - 이것은 사용, 특히 REST 서비스를 상당히 쉽게하는 것입니다 HttpClientWebClient. 이것은 가장 세밀한 제어를 제공하지만 문자열에있는 많은 서비스 API를 희생합니다. 예 : var content = new HttpClient().Get("http://yoursite.com/resource/id").Content;-API 세부 정보가 변경되면 런타임까지 오류가 발생하지 않습니다.

개인적으로 나는 옵션 1을 좋아하지 않았습니다. 자동 생성 코드에 의존하는 것은 지저분하고 너무 많은 제어력을 잃습니다. 또한 직렬화 문제가 자주 발생합니다. 두 개의 동일한 클래스 (서버 코드에 하나, 자동 생성됨)가 발생합니다.이 클래스는 정리할 수 있지만 고통 스럽습니다.

옵션 2는 완벽해야하지만 채널은 너무 제한적입니다. 예를 들어 HTTP 오류의 내용이 완전히 손실됩니다 . 즉, 서비스를 설명하는 인터페이스가 있으면 코딩 및 유지 관리가 훨씬 쉽습니다.


4
@MurHaf Nope-이 대답은 전적으로 내 작업입니다. 나는 항상 다른 사람들의 공헌을 돌립니다. 나는 다양한 작업에서 .Net에서 SOAP 서비스를 사용한 수년간의 작업을 기반 으로이 답변을 작성했습니다. 당신이 링크하는 그 기사는 2013 년 3 월의 것인데, 제 답변은 3 년 전인 2010 년 4 월에 작성되었습니다! 표절이 발생하면 그는 나를 복사했습니다. 매우 쉽기 때문에 비난하기 전에 날짜를 확인해야합니다.
Keith

@MurHaf 우리는 동일한 결론에 도달하지도 않았습니다.이 기사는 프록시 자동 생성 (옵션 1)을 '단순'으로 권장합니다. 설정하기는 쉽지만 유지 관리가 복잡하고 고통 스럽다고 설명합니다. 그는 자신의 프록시 작성에 대해서도 논의하지 않습니다 (옵션 3).
Keith

1
클라이언트를 "작성"하는 가장 일반적인 방법 중 하나이므로 SvcUtil도 언급해야한다고 생각합니다.
Mare Infinitus

21

MetadataResolver.Resolve 메서드와 함께 ChannelFactory를 사용합니다. 클라이언트 구성이 번거롭기 때문에 서버에서 ServiceEndpoint를 가져옵니다.

ChannelFactory (Of T)를 사용할 때 T는 프로젝트의 참조에서 가져올 수있는 원래 계약이거나 생성 된 계약 인스턴스입니다. 일부 프로젝트에서는 계약 dll에 대한 참조를 추가 할 수 없기 때문에 서비스 참조에서 코드를 생성했습니다. 서비스 참조로 비동기 계약을 생성하고 해당 계약 인터페이스를 ChannelFactory와 함께 사용할 수도 있습니다.

나를 위해 ChannelFactory를 사용하는 주요 포인트는 WCF 클라이언트 구성 정보를 제거하는 것이 었습니다. 아래 샘플 코드에서 구성없이 WCF 클라이언트를 얻는 방법을 볼 수 있습니다.

Dim fixedAddress = "net.tcp://server/service.svc/mex"
Dim availableBindings = MetadataResolver.Resolve(GetType(ContractAssembly.IContractName), New EndpointAddress(fixedAddress))
factoryService = New ChannelFactory(Of ContractAssembly.IContractName)(availableBindings(0))
accesService = factoryService.CreateChannel()

마지막 프로젝트에서 availableBindings는 가능한 경우 net.tcp 또는 net.pipe를 사용하도록 확인됩니다. 이렇게하면 내 요구에 가장 적합한 바인딩을 사용할 수 있습니다. 메타 데이터 끝 점이 서버에 존재한다는 사실에만 의존합니다.

이게 도움이 되길 바란다

BTW, 이것은 .NET 3.5를 사용하여 수행됩니다. 그러나 4.0에서도 작동합니다.


멋진 것들. MetadataResolver.Resolve도 구성에 사용하지만 서버에서 바인딩을 해결하는 것에 대해 생각하지 않았습니다. 아주 좋은 지적입니다!
Sleeper Smith

언급에 대한 찬성 투표The main point of using ChannelFactory to get rid of the WCF client config
Kurubaran

11

잘 사용 ChannelFactory<T>하려면 서비스와 클라이언트간에 계약 어셈블리를 기꺼이 공유해야합니다. 이것이 괜찮다면 ChannelFactory<T>시간을 절약 할 수 있습니다.


@Charles-이것이 사실이 아닌 이유를 설명해 주시겠습니까?
Aran Mulholland 2011

6
@Aran : Andrew가 말하는 것이 옳다고 생각합니다. 계약 클래스의 팩시밀리를 생성하지 않으려면 원본에 액세스해야합니다. 어떤 식 으로든 계약 클래스를 가져야한다는 것은 사실입니다. 이를 생성하거나, 직접 작성하거나, 서비스 소스 코드를 얻을 수 있습니다 (동일한 언어로되어있는 경우). 어셈블리를 공유하는 것이 가장 쉬운 방법이지만 항상 가능한 것은 아닙니다. (어쩌면 내가 너무 말 그대로 앤드류 데려 갈거야,하지만 선명도는 여기에 중요합니다.)
Igby Largeman에게

2
@Charles 좋습니다. T의 인터페이스를 직접 코딩 한 다음이를 사용하여 어셈블리에 액세스 할 수없는 경우에도 ChannelFactory <T>를 사용할 수 있다고 말씀하셨습니다.
Aran Mulholland 2011

1
@Aran : 예, 직접 코딩하거나 svcutil과 같은 도구를 사용합니다 (서비스가 실행 중이고 액세스 가능하다고 가정).
Igby Largeman 2011

9

프록시는 일종의 비동기 함수를 빌드합니다.


2
예-동시에 Visual Studio의 "서비스 참조 추가"와 명령 줄의 svcutil.exe는 인식 할 수없는 구성을 도살합니다. 적어도 svcutil.exe를 사용하면 "/ noconfig"스위치를 정의 할 수 있습니다. .....
marc_s

1
ChannelFactory는 또한 비동기 메서드를 제공합니다 : msdn.microsoft.com/en-us/library/ms731177.aspx 하지만 저는 T4 템플릿을 사용하여 동기 메서드를 호출하는 ThreadPool을 사용하여 비동기 클래스를 만드는 것을 선호합니다.
SandRock 2011

1
업데이트 : .NET 4.5를 사용하면 ChannelFactory <T>도 작업 기반 비동기 함수를 지원합니다.
gimpf

8

내 대답은 KeithAndrew Hare의 대답에 대한 일종의 요약입니다 .

서버를 제어하지 않고 WSDL / URL 만있는 경우 Visual Studio 또는 svcutil을 사용하여 프록시를 생성합니다. (Visual Studio는 때때로 svcutil이 더 잘 작동 할 때 실패합니다.)

서버와 클라이언트를 모두 제어 할 때 인터페이스 / 계약을 공유하고 ChannelFactory를 호출하십시오
.


2

단지 시간이 절약되는 문제가 아닙니다. WSDL 생성 프록시를 사용하는 것은 위험합니다. 서비스 참조를 업데이트하는 것을 잊은 경우 솔루션을 일관성없는 상태로 둘 수 있기 때문입니다. 모든 것이 컴파일되지만 서비스 계약이 깨졌습니다. 가능할 때마다 ChannelFactory를 사용하는 것이 좋습니다. 삶을 훨씬 더 쉽게 만듭니다.

가능한 대안은 SVCUtil 유틸리티를 호출하여 프로젝트를 빌드 할 때마다 프록시를 만드는 사전 빌드 스크립트를 작성하는 것일 수 있지만 어쨌든 ChannelFactory는 훨씬 더 깔끔하고 우아합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.