Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр2_Сервис удаленного взаимодействия.doc
Скачиваний:
10
Добавлен:
13.08.2019
Размер:
680.45 Кб
Скачать

1.4. Разработка Windows службы

Прежде чем двигаться дальше, необходимо убедиться, что в проекте сборки сервиса установлены ссылки на сборки сборку удаленных объектов 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.