12

私の教育におけるプロジェクトの一環として、私はいくつかの.netリアルタイム通信アプローチのパフォーマンステストを行っています。それらの1つはSignalerです。このため、私には2つのプログラムがあります。

  • ServerHostApp-単一のハブを公開するMicrosoft.AspNet.SignalR.Hosting.Self.Serverを備えたWPFアプリケーション。
  • ClientHostApp-多くのSignalerクライアントをホストするWPFアプリケーション

プログラムの一般的なワークフローは次のとおりです。サーバーを起動する->いくつかのクライアントをClientHostAppに接続する->テストを実行する。

プログラムが両方とも同じマシンでホストされている場合は正常に動作しますが、異なるコンピューターでプログラムを実行しようとすると、問題が発生します。特に、単一のClientHostAppインスタンスから複数のクライアントに接続することはできません。

サーバーコード:

 //starting up the server
public override void Start()
{
  string url = "http://*:9523/MessagingServiceHostWPF/";
  Server = new SignalR.Hosting.Self.Server(url);
  Server.MapHubs();
  Server.Start();
}

。。。

//one of the methods inside the hub exposed by the server
    public DataContracts.ClientInfo AcknowledgeConnection(string handle)
    {
       ServerLogic.DataContracts.ClientInfo clientInfo = SignalRApplicationState.SingletonInstance.AddClient(handle, Context.ConnectionId);;
       return clientInfo;
     }

ClientHostApp:

//starting many clients in a loop
foreach (var client in _clients)
{
  client.Start();
}

。。。

//method inside the Client class
public async void Start()
{
  _hubConnection = new HubConnection(EndpointAddress);  
  _hubProxy = _hubConnection.CreateProxy("MessagingHub");

  await _hubConnection.Start().ContinueWith(task =>
    {
      _hubProxy.Invoke<ClientLogic.MyServices.ClientInfo>("AcknowledgeConnection", Handle).ContinueWith((t) =>
         {
              ClientInfo = t.Result;
              IsConnected = true;
         });  
     });
}

同じClientHostAppインスタンスから1つのクライアントに接続しようとすると、成功します。ただし、2つ以上のクライアントに接続しようとすると、ハブのAcknowledgeConnectionメソッドが実行されないのに対し、ClientHostAppプログラムは応答なしでハングします。不思議なことに、クライアントマシンでFiddler2を起動すると、すべてのクライアントが接続され、テストを実行できます。

私がここで何が欠けているか知っていますか?ありがとう。

4

1 に答える 1

20

クライアントアプリのホストごとのデフォルトのネットワーク接続制限に達していると推測します。これはローカルホストには適用されないため、複数のマシンで実行した場合にのみ発生する可能性があります。解決する方法についていくつかのオプションがあります。

コードベース

すべてのホストの増加

ServicePointManager.DefaultConnectionLimit = 10;起動時に設定すると、通信しているホストへの10のアウトバウンド接続が提供されます。

特定のホストの増加

起動時に使用するServicePointManager.FindServicePoint(specificDomainUri).ConnectionLimit = 10と、その特定のIP/ドメインに対してのみ10のアウトバウンド接続が提供されます。

構成ベース

すべてのホストの増加

通信しているホストへのアウトバウンド接続を10に増やすには、以下を構成します。

 <system.net>
     <connectionManagement>
         <add name="*" maxconnection="10" />
     </connectionManagement>
 </system.net>

特定のホストの増加

特定のIP/ドメインのみへのアウトバウンド接続を10に増やすには、以下を構成します。

 <system.net>
     <connectionManagement>
         <add name="somesubdomain.somedomain.com" maxconnection="10" />
     </connectionManagement>
 </system.net>
于 2012-12-07T00:11:40.043 に答える