2011-02-24 8 views
3

.config 파일에 끝점 구성을 저장하고 싶지만 런타임에 기본 주소를 수정할 수 있어야합니다. EG :클라이언트에서 주소 가져 오기/수정 끝점 구성

<endpoint address="net.tcp://BASEURI:1001/FooService/" 
      binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Common" 
      contract="ServiceContracts.MyService" 
      name="FooService" /> 

<endpoint address="net.tcp://BASEURI:1002/BarService/" 
      binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Special" 
      contract="ServiceContracts.MyService" 
      name="BarService" /> 

각 서비스가 동일한 계약 (ServiceContracts.MyService)를 사용하지만 다른 포트, 다른 경로, 때로는 다른 바인딩 구성에 살고 :이 내 엔드 포인트 정의의 app.config에 있습니다.

프로그래밍 방식으로 "net.tcp : // BASEURI/FooService /"주소를 추출하고 서버의 주소로 "BASEURI"를 바꾸고 클라이언트로 전송할 때이 주소를 DuplexChannelFactory의 주소로 전달하고 싶습니다. 연결이 생성됩니다. EG는 :

string ServiceToUse = "FooService"; 

var endpointConfig = SomeFunctionThatGetsTheConfig(ServiceToUse); 
string trueAddress = endpointConfig.Address.Replace("BASEURI", "192.168.0.1"); 
DuplexChannelFactory<FooService> client = 
    new DuplexChannelFactory<FooService>(ServiceToUse, new EndpointAddress(trueAddress)); 

나는 클라이언트 엔드 포인트가 < 기본 주소를 서비스 엔드 포인트의 > 기능을 지원하지 않는 것을 알고 있지만, 내가 무엇을 알고 할 필요가 없도록 내 목표는 해결 방법을 어떻게 든입니다 나머지 URI 또는 ​​바인딩이 있습니다.

참고 : Proxy 클래스를 사용하고 있지 않습니다. DuplexChannelFactory를 직접 사용하고 있습니다.

답변

5

, 예를 들면 :

ChannelFactory<IFoo> cf = new ChannelFactory<IFoo>("EndpointConfigName"); 
string address = cf.Endpoint.Address.Uri.ToString(); 
address = address.Replace("BASEURI", "192.168.0.1"); 
cf.Endpoint.Address = new EndpointAddress(address); 

는 글쎄, 당신은 DuplexChannelFactory을 가지고 있지만 아이디어는 동일합니다 .

+0

완벽하게, 처음으로 작업했습니다. 많은 감사합니다. 편집 : WCF는 서버 부분 ToLower를 변환하는 것처럼 보이므로 "BASEURI"가 아닌 "baseuri"에서 일치시켜야합니다. 그렇지 않으면 잘 작동합니다. –

0

IEndpointBehavior을 구현하고 추가 할 때 URL을 변경하십시오.

당신은 변경해야 ServiceEndpointApplyClientBehavior에 : 당신은 당신의 ChannelFactory에에 매우 쉽게 할 수

void ApplyClientBehavior(
    ServiceEndpoint endpoint, 
    ClientRuntime clientRuntime 
) 
{ 
    endpoint.Address = ... 
} 
+0

IEndpointBehavior는 어디에 구현합니까? 프록시 클래스는 사용되지 않고 DuplexChannel 만 사용됩니다. –

+0

여기에서 예제를 살펴보십시오. http://msdn.microsoft.com/en-us/library/ms730137.aspx – Aliostad

+0

IEndpointBehavior를 구현할 수 있었지만 채널을 만들 때 ApplyCientBehavior 메서드가 호출되는 동안 너무 늦었습니다. 엔드 포인트 주소를 변경하십시오. 변경 사항이 적용되지 않습니다. –