ChannelFactory를 사용하여 호출을 호출 할 수있을 때 WCF 서비스에서 프록시를 생성하는 것을 선호하는 상황이 무엇인지 궁금하십니까?
이렇게하면 서버가 업데이트 될 때 프록시를 생성하고 프록시를 다시 생성하는 것에 대해 걱정할 필요가 없습니다.
감사
ChannelFactory를 사용하여 호출을 호출 할 수있을 때 WCF 서비스에서 프록시를 생성하는 것을 선호하는 상황이 무엇인지 궁금하십니까?
이렇게하면 서버가 업데이트 될 때 프록시를 생성하고 프록시를 다시 생성하는 것에 대해 걱정할 필요가 없습니다.
감사
답변:
WCF 클라이언트를 만드는 세 가지 기본 방법이 있습니다.
Visual Studio에서 프록시를 생성하도록합니다. 이 자동 생성은 WSDL을 읽어 서비스에 연결하는 코드입니다. 어떤 이유로 든 서비스가 변경되면 다시 생성해야합니다. 이것의 가장 큰 장점은 설정이 쉽다는 것입니다. VS에는 마법사가 있으며 모두 자동입니다. 단점은 VS에 의존하여 모든 힘든 작업을 수행하므로 통제력을 잃는다는 것입니다.
ChannelFactory
알려진 인터페이스와 함께 사용하십시오 . 이는 서비스 (서비스 계약)를 설명하는 로컬 인터페이스가 있어야합니다. 가장 큰 장점은 변경을 훨씬 더 쉽게 관리 할 수 있다는 것입니다. 변경 사항을 다시 컴파일하고 수정해야하지만 이제 코드를 다시 생성하지 않고 새 인터페이스를 참조합니다. 일반적으로 이것은 서버와 클라이언트를 모두 제어 할 때 사용됩니다. 둘 다 단위 테스트를 위해 훨씬 더 쉽게 조롱 할 수 있기 때문입니다. 그러나 인터페이스는 REST 서비스를 포함하여 모든 서비스에 대해 작성 될 수 있습니다 . 이 Twitter API를 살펴보십시오 .
자신의 프록시 쓰기 - 이것은 사용, 특히 REST 서비스를 상당히 쉽게하는 것입니다 HttpClient
나 WebClient
. 이것은 가장 세밀한 제어를 제공하지만 문자열에있는 많은 서비스 API를 희생합니다. 예 : var content = new HttpClient().Get("http://yoursite.com/resource/id").Content;
-API 세부 정보가 변경되면 런타임까지 오류가 발생하지 않습니다.
개인적으로 나는 옵션 1을 좋아하지 않았습니다. 자동 생성 코드에 의존하는 것은 지저분하고 너무 많은 제어력을 잃습니다. 또한 직렬화 문제가 자주 발생합니다. 두 개의 동일한 클래스 (서버 코드에 하나, 자동 생성됨)가 발생합니다.이 클래스는 정리할 수 있지만 고통 스럽습니다.
옵션 2는 완벽해야하지만 채널은 너무 제한적입니다. 예를 들어 HTTP 오류의 내용이 완전히 손실됩니다 . 즉, 서비스를 설명하는 인터페이스가 있으면 코딩 및 유지 관리가 훨씬 쉽습니다.
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에서도 작동합니다.
The main point of using ChannelFactory to get rid of the WCF client config
잘 사용 ChannelFactory<T>
하려면 서비스와 클라이언트간에 계약 어셈블리를 기꺼이 공유해야합니다. 이것이 괜찮다면 ChannelFactory<T>
시간을 절약 할 수 있습니다.
프록시는 일종의 비동기 함수를 빌드합니다.
내 대답은 Keith 와 Andrew Hare의 대답에 대한 일종의 요약입니다 .
서버를 제어하지 않고 WSDL / URL 만있는 경우 Visual Studio 또는 svcutil을 사용하여 프록시를 생성합니다. (Visual Studio는 때때로 svcutil이 더 잘 작동 할 때 실패합니다.)
서버와 클라이언트를 모두 제어 할 때 인터페이스 / 계약을 공유하고 ChannelFactory를 호출하십시오
.
단지 시간이 절약되는 문제가 아닙니다. WSDL 생성 프록시를 사용하는 것은 위험합니다. 서비스 참조를 업데이트하는 것을 잊은 경우 솔루션을 일관성없는 상태로 둘 수 있기 때문입니다. 모든 것이 컴파일되지만 서비스 계약이 깨졌습니다. 가능할 때마다 ChannelFactory를 사용하는 것이 좋습니다. 삶을 훨씬 더 쉽게 만듭니다.
가능한 대안은 SVCUtil 유틸리티를 호출하여 프로젝트를 빌드 할 때마다 프록시를 만드는 사전 빌드 스크립트를 작성하는 것일 수 있지만 어쨌든 ChannelFactory는 훨씬 더 깔끔하고 우아합니다.