Размещение служб WCF в нескольких службах Windows в одном процессе - PullRequest
0 голосов
/ 29 декабря 2010

Я создаю службу Windows для размещения службы WCF и использую:

var ServicesToRun = new ServiceBase[] 
            { new Service_1_Host() };
ServiceBase.Run(ServicesToRun);

Мой вопрос:

если у меня есть второй сервис с его хостом, и я добавил в массив в приведенном выше коде, как показано ниже:

var ServicesToRun = new ServiceBase[] { new Service_1_Host(), 
                                        new Service_2_Host() };
ServiceBase.Run(ServicesToRun);

работает ли второй хост со своим собственным доменом приложения, или я должен выполнить какую-то настройку, чтобы два хоста запускали его в отдельном домене приложения?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

Вы подходите ко всему неправильно ... вам нужно держать в стороне:

  • Служба Windows NT (производная от ServiceBase), которая просто предназначена для работы вокругclock

  • фактические хосты службы WCF (производные от ServiceHost), которые предоставляют реальные интерфейсы службы WCF.

В основном, что вам нужносделать это:

  • в вашей службе NT (ServiceBase) есть событие OnStart - внутри этого события вам нужно создать и открыть свои экземпляры WCF ServiceHost -по одному на каждый класс (реализацию) службы WCF

  • в этой службе NT (ServiceBase) есть событие OnStop, внутри которого вы должны закрыть хосты службы WCF

Какой-то ваш код будет выглядеть примерно так:

using System;
using System.ServiceModel;

namespace YourNameSpace
{
    public class WcfHostService : ServiceBase
    {
        private ServiceHost _serviceHost1 = null;
        private ServiceHost _serviceHost2 = null;

        protected override void OnStart(string[] args)
        {
            // instantiate new ServiceHost instances 
            if (_serviceHost1 == null)
            {
                _serviceHost1 = new ServiceHost(typeof(YourService1));
            }

            if (_serviceHost2 == null)
            {
                _serviceHost2 = new ServiceHost(typeof(YourService2));
            }

            // open service hosts
            _serviceHost1.Open();
            _serviceHost2.Open();
        }

        protected override void OnStop()
        {
            if (_serviceHost1.State != CommunicationState.Closed)
            {
                _serviceHost1.Close();
            }

            if (_serviceHost2.State != CommunicationState.Closed)
            {
                _serviceHost2.Close();
            }
        }
    }
}

, а затем в основном приложении NT Service вы получите:

var servicesToRun = new ServiceBase[] { new WcfHostService() };
ServiceBase.Run(servicesToRun);

Вот и вседействительно!

2 голосов
/ 29 декабря 2010

Обратите внимание, что это массив ServiceBase, а не HostsBase или что-то еще. Вы просто запускаете несколько служб Windows. Это не имеет ничего общего с WCF или даже с доменами приложений.

...