- •Тверской государственный технический университет
- •Построение Windows сервиса.
- •1. Теоретическая часть.
- •1.1. Альтернативные хосты для удаленных объектов
- •1.2. Хостинг удаленных объектов с использованием службы Windows
- •1.3. Построение сборки удаленных объектов.
- •1.4. Разработка Windows службы
- •1.4.1. Реализация метода Main() в классе Program.
- •1.4.2. Реализация класса Windows-службы CarService.
- •1.4.2.1. Метод CarService.OnStart()
- •1.4.2.2. Метод OnStop()
- •1.4.3. Создание инсталлятора службы
- •1.6. Инсталляция службы CarService
- •1.5. Создание консольного приложения клиента.
- •1.6. Создание Windows приложения клиента
- •1.7. Хостинг удаленных объектов с использованием iis
- •2. Указания к выполнению лабораторной работы
- •2.1. Задание на лабораторную работу
- •2.2. Содержание отчета по лабораторной работе
- •Литература:
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.
