从客户端端点配置获取/修改地址

时间:2011-02-24 17:41:19

标签: wcf .net-3.5

我想在.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:// 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));

我知道客户端端点不支持服务端点的&lt; baseAddress&gt; 功能,但我的目的是以某种方式解决这个问题,以便我不必知道是什么其余的URI或绑定是。

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

2 个答案:

答案 0 :(得分: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,但想法是一样的。

答案 1 :(得分:0)

实施IEndpointBehavior并在添加时更改网址。

您需要更改ServiceEndpoint中的ApplyClientBehavior

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