Как разместить две службы WCF с привязкой .net.tcp в Windows Service - PullRequest
0 голосов
/ 27 августа 2018

я хочу разместить две службы

  1. Служба 1 (расположена на диске D) обрабатывает данные на основе конфигурации, настроенной в xml net.tcp: // ServerIP / Pune_service
  2. Служба2 (находится на E-Drive) обрабатывает данные на основе конфигурации, настроенной в xml net.tcp: // ServerIP / Mumbai_service

Теперь я попытался разместить эти службы с привязкой net.tcp в двухдругая служба Windows служба Windows 1 успешно запущена, но при попытке запустить вторую службу Windows я получаю сообщение об ошибке, т.е. AddressAlreadyInUseException

  string httpBaseAddress = "http://" + _szServerIP + "/" + _szCurruntLocation + "_FileServer";
                string tcpBaseAddress = "net.tcp://" + _szServerIP + "/" + _szCurruntLocation + "_FileServer";


                Uri[] adrbase = { new Uri(httpBaseAddress), new Uri(tcpBaseAddress) };
                m_svcHost = new ServiceHost(typeof(MyService.CalcServiceClient), adrbase);

                ServiceMetadataBehavior mBehave = new ServiceMetadataBehavior();
                //mBehave.AddressFilterMode=AddressFilterMode.Any)]
                m_svcHost.Description.Behaviors.Add(mBehave);

                BasicHttpBinding httpb = new BasicHttpBinding();
                m_svcHost.AddServiceEndpoint(typeof(MyService.ICalcService), httpb, httpBaseAddress);
                m_svcHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");


                NetTcpBinding tcpb = new NetTcpBinding();
                tcpb.MaxConnections = 10;
                tcpb.MaxReceivedMessageSize = Int32.MaxValue;
                tcpb.MaxBufferPoolSize = Int32.MaxValue;
                tcpb.MaxBufferSize = Int32.MaxValue;
                tcpb.ReceiveTimeout = new TimeSpan(0, 10, 0);
                tcpb.OpenTimeout = new TimeSpan(0, 10, 0);
                tcpb.CloseTimeout = new TimeSpan(0, 10, 0);
                tcpb.PortSharingEnabled = true;

                m_svcHost.AddServiceEndpoint(typeof(MyService.ICalcService), tcpb, tcpBaseAddress);
                m_svcHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
                m_svcHost.Open();


                Console.WriteLine("Service is live now at : {0}", httpBaseAddress);
                Console.ReadLine();

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Насколько я знаю, MexTcpBinding отключает совместное использование порта.Это означает, что:

Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
CustomBinding mexBinding2 = new CustomBinding(mexBinding);
mexBinding2.Elements.Find<TcpTransportBindingElement>().PortSharingEnabled==false //true

Вот статья, которую стоит прочитать.
https://blogs.msdn.microsoft.com/drnick/2006/08/23/an-unanticipated-addendum-for-certain-mex-scenarios/
Я предлагаю вам написать собственную привязку, а затем добавить привязку к конечной точке mex.

TextMessageEncodingBindingElement encoding = new TextMessageEncodingBindingElement();
            TcpTransportBindingElement transport = new TcpTransportBindingElement();
            transport.PortSharingEnabled = true;
            CustomBinding binding1 = new CustomBinding(encoding, transport);
            m_svcHost.AddServiceEndpoint(typeof(IService), tcpb, tcpBaseAddress);
            m_svcHost.AddServiceEndpoint(typeof(IMetadataExchange), binding1, "mex");

Здесь есть связанная с этим проблема по этой теме.

https://blogs.msdn.microsoft.com/praburaj/2012/10/16/nettcpbinding-mextcpbinding-sharing-same-port-throws-addressalreadyinuseexception-on-upgrade-to-net-4-5/

Вы также можете прокомментировать следующие строки, чтобы обеспечить правильную работу кодов.

tcpb.MaxConnections = 10;
tcpb.PortSharingEnabled = true;
0 голосов
/ 27 августа 2018

Вот ссылка для AddressAlreadyInUseException.

Я думаю, вы можете удалить;

m_svcHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");

Вы пытаетесь добавить второй контракт IMetadataExchange для привязки tcp.

Также вам нужно добавить;

mBehave.HttpGetEnabled = true;

, чтобы получить мексиканскую информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...