【问题标题】:Dynamically set endpoint address in wcf client (with net tcp binding)在 wcf 客户端中动态设置端点地址(使用 net tcp 绑定)
【发布时间】:2012-08-25 22:23:39
【问题描述】:

所以我对 WCF 并不太熟悉,而且我在谷歌上搜索的所有内容都没有帮助我了解如何实现我所需要的。对不起,如果这是一个愚蠢的问题:)

基本上有一个服务器应用程序,其服务通过 WCF(网络 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();
        }

【问题讨论】:

    标签: .net wcf wcf-binding nettcpbinding


    【解决方案1】:

    你可以创建一个 ChannelFactory。

    除了您的标准客户端,WCF WSDL 还将为客户端提供一个接口类。

    EndpointAddress address = new EndpointAddress("http://dynamic.address.here");
            using (ChannelFactory<IPartyControllerChannel> factory = new ChannelFactory<IPartyControllerChannel>("IPartyControllerEndpoint", address))
            {
    
                using (IPartyControllerChannel channel = factory.CreateChannel())
                {
                    channel.GetLatestPartyProfile(context, parsedParameters.PartyId);
                }
            }
    

    【讨论】:

    • 我将把你的答案标记为答案......并用我使用的语法更新我的问题。我看不到一个将字符串和端点地址作为参数的 CreateChannel 构造函数 - 但设法将其弄清楚。感谢您为我指明正确的方向:)
    • 哈,谢谢,我更新了我的代码。我把地址初始化放错地方了。 :( 您也可以将 EndpointAddress 传递给创建通道函数。
    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2011-11-26
    相关资源
    最近更新 更多