Удерживать соединение TcpClient с WCF - PullRequest
0 голосов
/ 28 сентября 2010

Hallo Мне нужно Tcp-соединение с сервером, работающим в backgrond, и приложения будут отправлять данные с этим соединением. Я искал и обнаружил, что WCF-синглтон подходит для этой задачи. вот фрагмент кода, который я использую ниже мой вопрос в том, что хороший способ и любая проблема может быть с этим?

 string hostAddress = string.Empty;
           try
            {
                srvHost = new ServiceHost(typeof(ControllerClass));
                NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None);
                netTcpBinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
                netTcpBinding.Security.Transport.ProtectionLevel =      System.Net.Security.ProtectionLevel.None;
                netTcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;

                srvHost.AddServiceEndpoint(typeof(IControllerContract), netTcpBinding, hostAddress);
                srvHost.Credentials.WindowsAuthentication.AllowAnonymousLogons = true;

                ServiceThrottlingBehavior serviceThrottlingBehavior = new ServiceThrottlingBehavior();
                serviceThrottlingBehavior.MaxConcurrentCalls = 1000;
                serviceThrottlingBehavior.MaxConcurrentInstances = 1000;
                serviceThrottlingBehavior.MaxConcurrentSessions = 1000;
                srvHost.Description.Behaviors.Add(serviceThrottlingBehavior);
                srvHost.Open();
            }
            catch (System.TimeoutException timeoutEx)
            {

                Thread.Sleep(1000);
                ReOpenHostConnection();//initialize again Controller Class
            }
            catch (Exception ex)
            {
                Trace.WriteLine(string.Format("cannot start Service Ex:{0}", ex.ToString()), TraceEventType.Error.ToString());
            }

//Controller Class Initialize Code Snippet

TcpClient iTcpClient = new TcpClient();
                iTcpClient.Connect(serverIP, serverPort);
                networkStream = iTcpClient.GetStream();
                aSychDataByte = new byte[iTcpClient.ReceiveBufferSize];
                networkStream.BeginRead(aSychDataByte, 0, incommTcpClient.ReceiveBufferSize, ReadAsych, null);

1 Ответ

0 голосов
/ 28 сентября 2010

Почему вы комбинируете TcpClient с WCF? Если вам требуется низкоуровневая связь Tcp, создайте клиент и сервер на основе низкоуровневых классов Tcp. Если вам нужен сервис и вам не нужны форматы сообщений, используйте WCF.

Для вашей проблемы. Вам не нужен синглтон. Вам просто нужно открыть соединение. Для этого вам нужно создать экземпляр прокси WCF (открытый канал) на клиенте и вызвать сервис. Он создаст соединение с экземпляром службы, который будет действовать до тех пор, пока вы не закроете прокси-сервер клиента, пока хост-служба не перестанет работать или пока не истечет время ожидания (по умолчанию 10 минут бездействия клиента).

...