3

このエラーが発生しています:

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を設定するにはどうすればよいですか?(私が見つけることができるすべての例は、構成ファイルを使用しています)


このWebページでMaxPendingChannelsを検索して1つのオプションを探しますが、複雑すぎるようです。

4

4 に答える 4

6

これは私がしたことです:

 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);
于 2010-03-10T16:14:45.233 に答える
2

また、このプロパティをコードで設定する必要がありました。調査したところ、プログラムで設定する方法は2つあります。

最初の方法は、コードで直接バインディング要素を作成し、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);

私が見つけた2番目の方法は、ここで説明されているように、既存のバインディングからバインディング要素への参照を取得することです。方法:システム提供のバインディングをカスタマイズします。これが一番の答えです。

NetTcpBindingでReliableSessionプロパティを設定しようとしましたが、期待していたMaxPendingConnectionsプロパティを実際に変更していませんでした。NetTcpBindingとReliableSessionの.NETソースを調べたところ、このプロパティをこのようにバインディングに設定していることがわかりました。

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

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

バインディングにMaxPendingChannelsプロパティを実際に設定しません。

バインディングを正確に制御したかったので、バインディング要素から直接バインディングを作成することになりました。

于 2014-09-03T21:01:15.807 に答える
0

または、次のように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を参照してください。

于 2014-08-05T10:49:03.390 に答える
0

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);
于 2016-08-24T11:00:14.660 に答える