代码之家  ›  专栏  ›  技术社区  ›  Ian Ringrose

在代码中创建NetTcpBinding时,如何设置ReliableSession.MaxPendingChannels?

  •  3
  • Ian Ringrose  · 技术社区  · 15 年前

    我们得到这个错误:

    System.ServiceModel.ServerToobusyException:异常: 创建可靠的 会话已被rm拒绝 目的地。服务器 'net.tcp://localhost:50000/'也是 忙着处理此请求。尝试 稍后再来。频道不可能是 开的。

    据我所知,我需要增加ReliableSession绑定中MaxPendingChannels的值。

    但是,我们在如下代码中配置wcf:

    serviceHost = new ServiceHost(typeof(MyServiceClass));
    ServiceEndpoint endPoint = serviceHost.AddServiceEndpoint(
        typeof(IMyService),
        new NetTcpBinding(SecurityMode.None, true),
        endPointAddress);
    

    那么如何以编程方式设置reliablesession.maxpendingchannels? (我能找到的所有示例都使用配置文件)


    在此上搜索MaxPendingChannels web page 一种选择,但似乎过于复杂。

    4 回复  |  直到 9 年前
        1
  •  6
  •   Ian Ringrose    15 年前

    我就是这么做的:

     private Binding CreateBindingWith_MaxPendingChannels_Set(Binding baseBinding)
     {
         BindingElementCollection elements = baseBinding.CreateBindingElements();
         ReliableSessionBindingElement reliableSessionElement = 
                    elements.Find<ReliableSessionBindingElement>();
         if (reliableSessionElement != null)
         {
             reliableSessionElement.MaxPendingChannels = 128;
    
             CustomBinding newBinding = new CustomBinding(elements);
    
             newBinding.CloseTimeout = baseBinding.CloseTimeout;
             newBinding.OpenTimeout = baseBinding.OpenTimeout;
             newBinding.ReceiveTimeout = baseBinding.ReceiveTimeout;
             newBinding.SendTimeout = baseBinding.SendTimeout;
             newBinding.Name = baseBinding.Name;
             newBinding.Namespace = baseBinding.Namespace;
             return newBinding;
         }
         else
         {
             throw new Exception("the base binding does not " +
                                 "have ReliableSessionBindingElement");
         }
     }
    

     Binding customBinding = CreateBindingWith_MaxPendingChannels_Set(
          new NetTcpBinding(SecurityMode.None, true));
    
     serviceHost = new ServiceHost(typeof(MyService));
     ServiceEndpoint endPoint = serviceHost.AddServiceEndpoint(
                        typeof(IMyService),
                        customBinding,
                        endPointAddress);
    
        2
  •  1
  •   avid    11 年前

    我还需要在代码中设置这个属性,在研究之后发现有两种方法可以通过编程来实现。

    第一种方法是直接在代码中创建绑定元素,并根据 CustomBinding MSDN

    // Create a custom binding that contains two binding elements.
    ReliableSessionBindingElement reliableSession = new ReliableSessionBindingElement();
    reliableSession.MaxPendingChannels = 100;
    
    TcpTransportBindingElement tcpTransport = new TcpTransportBindingElement();
    
    CustomBinding binding = new CustomBinding(reliableSession, tcpTransport);
    

    我找到的第二种方法是从现有绑定中获取对绑定元素的引用,如下所述 How to: Customize a System-Provided Binding . 这就是最重要的答案。

    我试图在nettcpbinding上设置reliablesession属性,但它实际上并没有像我期望的那样修改maxpendingconnections属性。在查看netcpbinding和reliablesession的.NET源代码后,我发现在绑定上设置此属性如下

    NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None, true);
    
    netTcpBinding.ReliableSession = 
        new OptionalReliableSession(
            new ReliableSessionBindingElement()
                {
                    MaxPendingChannels = 100
                });
    

    实际上并没有在绑定上设置MaxPendingChannels属性。

    我最终直接从binding元素创建了绑定,因为我想精确地控制绑定

        3
  •  0
  •   darkArk    11 年前

    或者可以使用 ReliableSession 来自的属性 NetTcpBinding 这样地:

    // initialize ReliableSessionBindingElement object
    var reliableSessionBindingElement = new ReliableSessionBindingElement
    {
      MaxPendingChannels = 128
      // set other properties here
    }; 
    
    binding.ReliableSession = new ReliableSession(reliableSessionBindingElement)
    {
      // set properties here
    };
    

    有关详细信息,请参阅: http://msdn.microsoft.com/en-us/library/ms585454(v=vs.110).aspx

        4
  •  0
  •   Bart Bourgeois    9 年前

    如果使用像nettcpreaybinding这样的中继绑定,则可以使用以下代码:

    public static class NetTcpRelayBindingExtension
    {
        public static void SetReliableSessionMaxPendingChannels(this NetTcpRelayBinding baseBinding, Int32 MaxPendingChannels)
        {
            var bindingType = baseBinding.GetType();
            var bindingProperty = bindingType.GetField("session", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic);
            var reliableSession = (ReliableSessionBindingElement)bindingProperty.GetValue(baseBinding);
            reliableSession.MaxPendingChannels = MaxPendingChannels;
        }
    }
    

    用途:

    var binding = new NetTcpRelayBinding();
    binding.SetReliableSessionMaxPendingChannels(128);
    
    推荐文章