WCF - 如何以编程方式设置绑定配置?

Posted

技术标签:

【中文标题】WCF - 如何以编程方式设置绑定配置?【英文标题】:WCF - how programmatically set bindingconfiguration? 【发布时间】:2021-08-09 09:12:17 【问题描述】:

现在在客户端 app.config 中:

<system.serviceModel>
    <client>
      <endpoint name="FileEndPoint" address="net.p2p://ChangingName123/FileServer"
                binding="netPeerTcpBinding" bindingConfiguration="PeerTcpConfig"
                contract="FileClient.IFileService"></endpoint>
     
      
   </client>

    <bindings>
      <netPeerTcpBinding>
        <binding name="PeerTcpConfig" port="0">
          <security mode="None"></security>
          <resolver mode="Custom">
            <custom address="net.tcp://191.14.3.11/FileServer" binding="netTcpBinding"
                    bindingConfiguration="TcpConfig"></custom>
          </resolver>
        </binding>
        
      </netPeerTcpBinding>
      <netTcpBinding>
        <binding name="TcpConfig">
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>

在客户端代码中:

InstanceContext context = new InstanceContext(
                        new ChatClient(numberclient);
DuplexChannelFactory<IFileChannel> factory =
                        new DuplexChannelFactory<IFileChannel>(context, "FileEndPoint");
IFileChannel channel = factory.CreateChannel();
                                        
channel.Open();

我尝试这样做:

NetPeerTcpBinding binding = new NetPeerTcpBinding();
            
EndpointAddress endpoint = new EndpointAddress("net.p2p://ChangingName123/FileServer");

InstanceContext context = new InstanceContext(
                        new ChatClient(numberclient);
DuplexChannelFactory<IFileChannel> factory =
                        new DuplexChannelFactory<IFileChannel>(context, binding, endpoint);

但“PeerTcpConfig”有custom address="net.tcp://191.14.3.11/FileServer" bindingConfiguration="TcpConfig"

如何在代码中设置绑定自定义地址并为 NetPeerTcpBinding 绑定设置一个绑定 TcpConfig

【问题讨论】:

可以参考:docs.microsoft.com/en-us/dotnet/framework/wcf/samples/… 本文中的 app.config 中有多个端点,但需要示例如何在代码中生成以及在代码中询问您可以看到一个端点的多个绑定 先在ru讨论中发布这个问题,找到解决方案here 【参考方案1】:
  private NetTcpBinding binding = new NetTcpBinding();
  private EndpointAddress endPoint;

  private void initial_binding()
    
        binding.Security.Mode = SecurityMode.None;
        
        binding.HostNameComparisonMode = HostNameComparisonMode.WeakWildcard;
       
        binding.ReliableSession.Enabled = false;
    

initial_binding();
endPoint= new EndpointAddress(@"net.tcp://" + 191.14.3.11+ @":4000/FileServer");


 var IAChannelFactory = new ChannelFactory<FileClient.IFileService>(binding, 
 endpoint);
            IFileService Client = new FileService();
            try
             
                client.anyFunction();
             
            catch (Exception ex)
             
                Logger.Log.Error(ex.Message);
             

第一步,您应该定义 netTcpBinding 和一个端点,然后在这些简单地创建 ChannelFactory 对象并连接到您的服务之后分配您的自定义绑定和您的端点(您应该使用一个端口连接到您的端点)。这段代码在我的项目中工作了一年,我只是根据你的代码自定义它。如果您有任何问题,请尽管问。

【讨论】:

【参考方案2】:

完成工作代码:

InstanceContext context = new InstanceContext(new ChatClient(numberclient));
NetPeerTcpBinding binding = new NetPeerTcpBinding();

EndpointAddress endpoint = new EndpointAddress("net.p2p://ChangingName123/FileServer");
binding.Resolver.Custom.Address = new EndpointAddress("net.tcp://191.14.3.11/FileServer");
binding.Security.Mode = SecurityMode.None;
NetTcpBinding ntcp = new NetTcpBinding();
ntcp.Security.Mode = SecurityMode.None;
binding.Resolver.Custom.Binding = ntcp;
factory = new DuplexChannelFactory<IChatChannel>(context, binding, endpoint);
channel = factory.CreateChannel();

【讨论】:

以上是关于WCF - 如何以编程方式设置绑定配置?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式使用证书身份验证配置 WCF 服务客户端

在调试模式下以编程方式设置 WCF 超时

以编程方式创建自定义绑定

如何以编程方式配置 WCF 已知类型?

从.NET调用WCF服务时如何以编程方式添加soap标头?

Silverlight WCF 超时