2011-02-24 44 views
3

我想将端点配置存储在.config文件中,但能够在运行时修改基址。 EG:这些都是我的端点定义中的app.config:从客户端获取/修改地址端点配置

<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),但住在不同的端口,不同的路径,有时不同的绑定配置上。

我希望能够以编程方式提取地址“的net.tcp://基本URI/FooService接口/”,将“基本URI”与服务器的地址,然后当客户端通过这个作为地址的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)); 

我知道,客户终端不支持< baseAddress的服务端点>功能,但我的目的是要变通,不知怎的让我不必知道是什么其余的URI或绑定是。

注意:我没有使用Proxy类,我直接使用DuplexChannelFactory。

回答

5

您可以在自己的ChannelFactory做到这一点很容易,如:

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”。否则,它工作正常。 – 2011-02-24 19:14:11

0

执行IEndpointBehavior并在添加时更改URL。

您需要更改ServiceEndpointApplyClientBehavior

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

我在哪里实现IEndpointBehavior?没有使用代理类,只有DuplexChannel。 – 2011-02-24 18:09:51

+0

看看这里的例子:http://msdn.microsoft.com/en-us/library/ms730137.aspx – Aliostad 2011-02-24 18:20:05

+0

虽然我设法实现了IEndpointBehavior,并且我的ApplyCientBehavior方法在通道创建时调用,但为时已晚更改端点地址。该更改不会生效。 – 2011-02-24 19:07:40