所以我对 WCF 并不太熟悉,我在谷歌上搜索的所有东西都没有帮助我实现我所需要的。对不起,如果这是一个愚蠢的问题:)
基本上有一个服务器应用程序,其服务通过 WCF(net tcp 绑定)公开。我编写了一个新的控制台应用程序,我需要调用该服务。所以我可以通过为我们拥有的代理项目添加一个 dll 并添加一堆配置文件(例如 WCFClientBindings、WCFClientEndPoints)来实现这一点。如果我使用定义的端点,那么我可以调用这样的代码:
using (var partyProxy = new PartyControllerProxy())
{
// execute server method
partyProfile = partyProxy.GetLatestPartyProfile(context, parsedParameters.PartyId);
}
但是,应用程序应该能够调用作为命令行参数传入的主机名。
因此,虽然我的应用程序使用定义的端点:
<client>
<endpoint
name="IPartyControllerEndpoint"
address="net.tcp://localhost:46000/ServiceInterface/PartyController.svc"
binding="customBinding" bindingConfiguration="DefaultNetTcpBindingConfiguration"
contract="CompanyA.Service.Product.Core.Contracts.IPartyController"
behaviorConfiguration="DefaultEndpointBehavior">
</endpoint>
</client>
我需要能够将 localhost 主机名更新为可能的其他内容。我希望安全不会绊倒我:)
我看到的示例似乎通过传入“动态”绑定和地址来实例化客户端/代理,但我们的代理类不接受这些。在调用“代理”类之前有没有办法更新端点的地址(在运行时)?我见过的唯一其他示例涉及实例化一个新的 ServiceHost - 但这听起来不太适合客户端:)
谢谢!
编辑 -好的,这里的语法似乎很好用。这与我接受的答案有点不同,但这种方法是要走的路:)
using (ChannelFactory<IPartyController> factory = new ChannelFactory<IPartyController>("IPartyControllerEndpoint"))
{
EndpointAddress address = new EndpointAddress(String.Format("net.tcp://{0}/ServiceInterface/PartyController.svc", parsedParameters.HostName));
IPartyController channel = factory.CreateChannel(address);
partyProfile = channel.GetLatestPartyProfile(context, parsedParameters.PartyId);
((IClientChannel)channel).Close();
}