在客户端中动态设置WCF服务的基地址

时间:2019-06-13 06:10:22

标签: c# wcf

我建立了WCF服务库,并通过主机应用程序将其托管。然后,我构造了一个客户端应用程序,但似乎服务主机的地址已在客户端程序中进行了硬编码。如果主机更改地址怎么办?是否可以编写客户端应用程序,以便客户端可以在运行时输入主机的地址?

1 个答案:

答案 0 :(得分:1)

是的,有可能,如果您手动编写WCF客户端代理,而不是通过添加服务引用的Visual Studio自动生成。

让我们从这个示例(https://docs.microsoft.com/it-it/dotnet/framework/wcf/feature-details/how-to-use-the-channelfactory)开始,只是为了了解ChannelFactory的工作原理,然后对其进行一些修改,并添加以下功能。

private ChannelFactory<IMath> _myChannelFactory;

// ...

private IMath GetChannel(string endpointConfigurationName, string endpointAddress)
{
    if (_myChannelFactory == null)
    {
        this.DebugLog("Channel factory is null, creating new one");
        if (String.IsNullOrEmpty(endpointAddress))
        {
            _myChannelFactory = new ChannelFactory<IMath>(endpointConfigurationName);
        }
        else
        {
            _myChannelFactory = new ChannelFactory<IMath>(endpointConfigurationName, new EndpointAddress(endpointAddress));
        }
    }
    return _myChannelFactory.CreateChannel();
}

您可以在客户端App.config文件中定义默认服务器IP

<system.serviceModel>
    <!-- ... -->
    <client>      
        <endpoint address="net.tcp://192.168.10.55:81/math/" binding="netTcpBinding" 
                  bindingConfiguration="NetTcpBinding_IMath" 
                  contract="MyNamespace.IMath" name="NetTcpBinding_IMath" />      
    </client>
</system.serviceModel>

通过这种方式,当调用GetChannel("NetTcpBinding_IMath", "net.tcp://127.0.0.1:81/math")时,它将从App.config文件中提取端点配置,用新的地址(127.0.0.1)替换默认地址(192.168.10.55)。

有关ChannelFactory的更多文档:https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.channelfactory-1.createchannel?view=netframework-4.8