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