Прежде чем двигаться дальше, необходимо убедиться, что в проекте сборки сервиса установлены ссылки на сборки сборку удаленных объектов CarGeneralAsm.dll и System.Remoting.dll и специфицированы следующие дополнительные директивы using в файле Service1.cs, содержащем определение класса CarService:
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using System.ServiceProcess;
using System.Diagnostics;
1.4.1. Реализация метода Main () в классе Program.
Метод Main () класса Program отвечает за запуск каждой службы, определенной в проекте, посредством передачи массива объектов типа ServiceBase в статический метод Service.Run (). Учитывая переименование специальной службы с Service1 на CarService, вы должны получить следующее определение класса Program:
…
using System.ServiceProcess;
static class Program
{
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new CarService() };
ServiceBase.Run(ServicesToRun);
}
}
1.4.2. Реализация класса Windows-службы CarService.
Класс службы, созданный Visual Studio по умолчанию содержит всего три метода: конструктор по умолчанию, метод OnStart и метод OnStop и имеет следующий вид:
|
|
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Тcp;
using System.Runtime.Remoting.Channels;
using System.ServiceProcess;
using System.Diagnostics;
namespace CarWinService
{
public partial class CarService: ServiceBase
{
public CarService() { InitializeComponent(); }
protected override void OnStart(string[] args) { }
protected override void OnStop() { }
}
}
1.4.2.1. Метод CarService.OnStart ()
Вероятно, вы уже представяете, какого рода логика должна выполняться при запуске специальной службы на заданной машине. Напомним, что роль службы CarService состоит в выполнении тех же задач, которые выполняли и разработанные в предыдущей работе приложения сервера (хоста), владеющие удаленным объектом. Поэтому, если вы хотите зарегистрировать службу CarService как службу, владеющую одиночным объектом WKO -типа, доступного через http -канал, то можете добавить следующий код в метод OnStart ():
protected override void OnStart(string[] args)
{
// Создать новый HttpChannel.
HttpChannel c = new HttpChannel(32469);
ChannelServices.RegisterChannel(c);
// Зарегистрировать WKO одиночного вызова.
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(CarGeneralAsm.CarProvider),
"CarProvider.soap",
WellKnownObjectMode.SingleCall);
// Протоколировать успешный запуск.
EventLog.WriteEntry("CarWinService", "CarWinService started successfully!",
EventLogEntryType.Information);
}
Обратите внимание на то, что, как только тип зарегистрирован, то в журнал событий Windows, будет записано специальное сообщение (через объект типа System.Diagnostics.EventLog) для документирования успешного запуска службы на машине-хосте.
Примечание. Как и следовало надеяться, тип RemotingConfiguration можно применять для загрузки конфигурационного файла *.config серверной стороны вместо того, чтобы жестко кодировать реализацию при развертывании удаленных объектов с использованием службы Windows.
|
|
1.4.2.2. Метод OnStop ()
С технической точки зрения класс CarService не требует никакой логики останова службы. В целях иллюстрации давайте отправим еще одно сообщение в EventLog, чтобы запротоколировать останов создаваемой службы Windows:
protected override void OnStop()
{
EventLog.WriteEntry("CarWinService", "CarWinService stopped",
EventLogEntryType.Information);
}