Как я могу инициализировать сервер при запуске? - PullRequest
1 голос
/ 23 апреля 2010

Мне нужно сделать несколько подключений при запуске сервера. Я использую технологию wcf для этого клиент-серверного приложения. Проблема в том, что конструктор сервера не вызывается в любой момент, поэтому на данный момент я инициализирую соединения, когда первый клиент устанавливает соединение. Но это порождает проблемы в дальнейшей части.

Это настройки моего сервера:

private static ServiceHost _svc;

    static void Main(string[] args)
    {
        NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message);
        Uri address = new Uri("net.tcp://localhost:8000");
        _svc = new ServiceHost(typeof(MonitoringSystemService), address);
        publishMetaData(_svc, "http://localhost:8001");
        _svc.AddServiceEndpoint(typeof(IMonitoringSystemService), binding, "Monitoring Server");
        _svc.Open();

        Console.WriteLine("Listener service gestart op net.tcp://localhost:8000/Monitoring");
        Console.ReadLine();
    }

    private static void publishMetaData(ServiceHost svc, string sEndpointAddress)
    {
        ServiceMetadataBehavior smb = svc.Description.Behaviors.Find<ServiceMetadataBehavior>();
        if (smb != null)
        {
            smb.HttpGetEnabled = true;
            smb.HttpGetUrl = new Uri(sEndpointAddress);
        }
        else
        {
            smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.HttpGetUrl = new Uri(sEndpointAddress);
            svc.Description.Behaviors.Add(smb);
        }
    }

Как запустить сервер, не дожидаясь входа клиента, чтобы я мог его инициализировать.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2010

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

Вы можете отключить это поведение и вместо этого просто использовать один экземпляр MonitoringSystemService, который создается при запуске вашей программы. Вместо того, чтобы указывать WCF, какой тип должен быть создан автоматически, вы просто создаете его сами и передаете:

_svc = new ServiceHost(new MonitoringSystemService()), address);

Вы получаете контроль над тем, когда работает конструктор MonitoringSystemService, за счет масштабируемости.

В качестве альтернативы (если вам нужна масштабируемость), вы можете «инициализировать соединения» в вашем методе Main, но помните, что WCF может создавать экземпляры нескольких MonitoringSystemServices, которые должны будут совместно использовать эти соединения.

0 голосов
/ 23 апреля 2010

Есть два способа, о которых я могу сразу подумать.

Один - вы можете реализовать свое решение как службу Windows

и Второй - позволить фиктивной клиентской программе вызывать ваш сервер при запуске.

...