Как мне установить ReliableSession.MaxPendingChannels при создании NetTcpBinding в коде? - PullRequest
3 голосов
/ 10 марта 2010

Мы получаем эту ошибку:

System.ServiceModel.ServerTooBusyException: Просьба создать надежный сеанс был отклонен RM Место назначения. сервер 'net.tcp: // localhost: 50000 /' слишком занят для обработки этого запроса. Пытаться снова позже. Канал не может быть открыт.

Насколько я понимаю, мне нужно увеличить значение MaxPendingChannels в привязке ReliableSession.

Однако мы настраиваем WCF в коде так:

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

Так как мне установить ReliableSession.MaxPendingChannels программно? (Все примеры, которые я могу найти, используют файлы конфигурации)


Поиск MaxPendingChannels на этой веб-странице для одной опции, но она кажется слишком сложной.

Ответы [ 4 ]

6 голосов
/ 10 марта 2010

Вот что я сделал:

 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 голосов
/ 04 сентября 2014

Мне также нужно было установить это свойство в коде, и после исследования выяснилось, что есть два способа сделать это программно.

Первый способ - создать элементы привязки непосредственно в коде и создать из них новую пользовательскую привязку, как описано в 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);

второй способ, который я нашел, это получить ссылку на элементы привязки из существующей привязки, как описано здесь Как: настроить привязку, предоставляемую системой . Это самый лучший ответ.

Я пытался установить свойство ReliableSession в NetTcpBinding, но на самом деле это не было изменение свойства MaxPendingConnections, которое я ожидал. Изучив исходный код .NET для NetTcpBinding и ReliableSession, я обнаружил, что установка этого свойства для привязки выглядит так:

NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None, true);

netTcpBinding.ReliableSession = 
    new OptionalReliableSession(
        new ReliableSessionBindingElement()
            {
                MaxPendingChannels = 100
            });

Фактически не устанавливает свойство MaxPendingChannels в привязке.

Я закончил тем, что создал привязку непосредственно из элементов привязки, так как хотел точно контролировать привязку

0 голосов
/ 24 августа 2016

Если вы используете привязки реле, такие как NetTcpRelayBinding, вы можете использовать следующий код:

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);
0 голосов
/ 05 августа 2014

Или вы можете использовать конструктор свойства 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

...