- •1. Язык программирования c# 3
- •2. Базовые элементы .Net Framework 67
- •3. ТЕхнология .Net Remoting 144
- •Введение
- •1. Язык программирования c#
- •1.1. Платформа .Net – обзор архитектуры
- •1.2. Язык c# - общие концепции синтаксиса
- •1.3. Система типов языка c#
- •1.4. Преобразования типов
- •1.5. Идентификаторы, ключевые слова и литералы
- •1.6. Объявление переменных, полей и констант
- •1.7. Выражения и операции
- •1.8. Операторы языка c#
- •1.9. Объявление и вызов методов
- •1.10. Массивы в c#
- •1.11. Работа с символами и строками в c#
- •1.12. Синтаксис объявления класса, Поля и методы класса
- •1.13. Свойства и индексаторы
- •1.14. Конструкторы класса и Жизненный цикл объекта
- •1.15. Наследование классов
- •1.16. Перегрузка операЦий
- •1.17. Делегаты
- •1.18. События
- •1.19. Интерфейсы
- •1.20. Структуры и перечисления
- •1.21. Пространства имен
- •1.22. Генерация и обработка исключительных ситуаций
- •1.23. Нововведения в языке c# 2.0
- •1.24. Обобщенные типы (generics)
- •2. Базовые элементы .Net Framework
- •2.1. Метаданные и механизм отражения
- •2.2. Пользовательские и встроенные атрибуты
- •2.3. Пространство имен system.Collections
- •2.4. Работа с файлами и директориями
- •2.5. Использование потоков данных
- •2.6. Сериализация
- •2.7. Сериализация объектов в нестандартном формате
- •2.8. Введение в xml
- •2.9. Работа с xml-документами в .Net framework
- •2.10. МНогопоточное программирование
- •2.11. Синхронизация потоков
- •2.12. Асинхронный вызов методов
- •2.13. Состав и взаимодействие сборок
- •2.14. Конфигурирование сборок
- •3. ТЕхнология .Net Remoting
- •3.1. Домены приложений
- •3.2. Архитектура .Net Remoting
- •3.3. Активация удаленных объектов и их время жизни
- •3.4. Программная настройка Remoting
- •3.5. Удаленные Объекты с клиентской активацией
- •3.6. Настройка Remoting при помощи конфигурационных файлов
- •3.7. Хостинг распределенных приложений
- •3.8. Объекты-сообщения
- •3.9. Пользовательские канальные приемники
- •4.1. Архитектура ado.Net
- •4.2. Учебная база cd Rent
- •4.3. Соединение с базой данных
- •4.4. Выполнение команд и запросов к базе данных
- •4.5. Чтение данных и объект DataReader
- •4.6. Параметризированные запросы
- •4.7. Рассоединенный набор данных
- •4.8. Заполнение Рассоединенного набора данных
- •4.9. Объект класса DataColumn – колонка таблицы
- •4.10. Объекты класса DataRow – строки таблицы
- •4.11. Работа с объектом класса DataTable
- •4.12. DataSet и схема рассоединенного набора данных
- •4.13. Типизированные DataSet
- •4.14. Поиск и фильтрация данных в DataSet
- •4.15. Класс DataView
- •4.16. СиНхронизация набора данных и базы
- •5.1. Архитектура и общие концепции asp.Net
- •5.2. Пример aspx-страницы. Структура страницы
- •5.3. Директивы страницы
- •5.4. Класс System.Web.Ui.Page. События страницы
- •5.5. Серверные элементы управления
- •5.6. Элементы управления Web Controls
- •5.7. Проверочные элементы управления
- •5.8. Списковые элементы управления
- •5.9. Связывание данных
- •5.11. Управление состояниями в web-приложениях
- •5.12. Кэширование
- •5.13. Безопасность в web-приложениях
- •5.14. Создание пользовательских элементов управления
- •Литература
3.7. Хостинг распределенных приложений
В данном параграфе обсуждаются различные виды размещения (хостинга) серверных компонент распределенных приложений. В качестве примера удаленного класса на протяжении параграфа будет использоваться простой класс BSUIR.Calculator, который скомпилирован в сборку с именем calc.dll.
using System;
namespace BSUIR {
public class Calculator: MarshalByRefObject {
public Calculator() {
log("Calculator constructor");
}
public double Add(double x, double y) {
log("Add " + x + " + " + y);
return x + y;
}
public static void log(string s) {
Console.WriteLine("[{0}]: {1}",
AppDomain.CurrentDomain.FriendlyName, s);
}
}
}
Обратите внимание, что в компоненте не выделен интерфейс. Для предоставления клиенту метаданных компонента будем просто передавать сборку с компонентом клиенту.
Клиент, используемый в примерах, достаточно стандартен:
using System;
using System.Runtime.Remoting;
using BSUIR;
class CalcClient {
public static void Main() {
string filename = "client.exe.config";
RemotingConfiguration.Configure(filename);
Calculator c = new Calculator();
Console.WriteLine(c.Add(3, 4));
}
}
Настройка Remoting на стороне клиента выполняется при помощи файлов конфигурации, которые будут описаны ниже.
В Remoting серверные компоненты распределенных приложений могут использовать хостинг на основе консольных приложений или приложений Windows Forms, хостинг Windows-сервиса или хостинг при помощи веб-сервера Internet Information Server (IIS).
Хостинг на основе консольных приложений или приложений Windows Forms прост в реализации. Однако такой вид хостинга имеет ряд недостатков. В частности, необходим ручной запуск приложения-сервера, затруднено решение проблем аутентификации и логирования.
Рассмотрим хостинг компонент с использованием Windows-сервиса. В .NET Framework пользовательский Windows-сервис – это класс, производный от ServiceProcess.ServiceBase. Обычно в классе требуется переписать виртуальный метод onStart() для выполнения некоторых полезных действий. В следующем листинге приведена «заготовка» пользовательского сервиса:
using System;
using System.ServiceProcess;
namespace WindowsService {
public class DummyService : ServiceBase {
public static string SVC_NAME = "Some dummy service";
public DummyService() {
// в конструкторе установим свойство – имя сервиса
this.ServiceName = SVC_NAME;
}
static void Main() {
//стартуем сервис
ServiceBase.Run(new DummyService());
}
protected override void OnStart(string[] args) {
// полезный код сервиса
}
protected override void OnStop() {
// действия сервиса перед остановкой
}
}
}
Для установки пользовательского сервиса в систему требуется создать специальный класс-инсталлятор. Этот класс будет обрабатываться утилитой установки installutil.exe, которая входит в состав .NET Framework. В следующем листинге показан простой класс-инсталятор, настраивающий сервис на автоматический старт при запуске системы:
using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;
using WindowsService;
[RunInstallerAttribute(true)]
public class MyProjectInstaller: Installer {
private ServiceInstaller serviceInstaller;
private ServiceProcessInstaller processInstaller;
public MyProjectInstaller() {
processInstaller = new ServiceProcessInstaller();
serviceInstaller = new ServiceInstaller();
processInstaller.Account = ServiceAccount.LocalSystem;
serviceInstaller.StartType =
ServiceStartMode.Automatic;
serviceInstaller.ServiceName = DummyService.SVC_NAME;
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
}
}
Два файла – файл с кодом сервиса и файл с классом-инсталлятором – требуется скомпилировать в одну сборку (например, CustomWinServ.exe). Для установки сервиса выполняется следующая команда:
installutil CustomWinServ.exe
В случае успешной установки сервис ведет себя как любой стандартный сервис, он допускает управление (старт-стоп) при помощи оснастки администрирования (MMC).
Разрабатываемый сервис имеет возможность записывать информацию в Журнал событий (Event Log) системы. Для этого достаточно объявить в классе-сервисе статическую переменную типа System.Diagnostics.EventLog и использовать ее метод WriteEntry().
В листинге представлен класс-сервис для BSUIR.Calculator:
using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.Runtime.Remoting;
namespace WindowsService {
public class RemotingService : ServiceBase {
private static EventLog evt = new EventLog("Application");
public static string SVC_NAME = "Remoting Sample Service";
public RemotingService() {
this.ServiceName = SVC_NAME;
}
static void Main() {
evt.Source = SVC_NAME;
evt.WriteEntry("Remoting Service intializing");
ServiceBase.Run(new RemotingService());
}
protected override void OnStart(string[] args) {
evt.WriteEntry("Remoting Service started");
String filename = "WinServ.exe.config";
RemotingConfiguration.Configure(filename);
}
protected override void OnStop() {
evt.WriteEntry("Remoting Service stopped");
}
}
}
Класс-инсталятор остается практически без изменений (используется имя класса-сервиса RemotingService). Два файла компилируются в сборку CustomWinServ.exe, к которой подключается сборка calc.dll.
Конфигурационный файл CustomWinServ.exe.config имеет такой вид:
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" port="1234" />
</channels>
<service>
<wellknown mode="Singleton"
type="BSUIR.Calculator, Calc"
objectUri="Calculator.soap" />
</service>
</application>
</system.runtime.remoting>
</configuration>
Соответствующий конфигурационный файл для клиента:
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http" port="0" />
</channels>
<client>
<wellknown type="BSUIR.Calculator, Calc"
url="http://localhost:1234/Calculator.soap" />
</client>
</application>
</system.runtime.remoting>
</configuration>
Хостинг с использованием IIS обладает рядом преимуществ по сравнению с другими видами хостинга. В частности, IIS может быть сконфигурирован для обеспечения аутентификации пользователей удаленного компонента, а также для шифрования серверного трафика. Необходимо понимать, что IIS-хостинг накладывает ряд ограничений на конфигурацию удаленного класса. Допустимо использование только HTTP-канала (возможно, с нестандартным форматером). По сравнению с другими видами хостинга, использование IIS является менее производительным решением.
Общая схема IIS-хостинга проста:
Удаленные типы размещаются в отдельной сборке (библиотеке классов).
При помощи оснастки IISAdmin создается виртуальная директория, соответствующая серверной части распределенного приложения.
В поддиректорию bin помещается библиотека классов.
В виртуальной директории размещается конфигурационный файл, который называется web.config.
Создадим при помощи оснастки IISAdmin виртуальный каталог. Виртуальный каталог является частью URL и соответствует некому физическому каталогу на сервере. Например, в URL вида http://host_name/directory_name виртуальный каталог – это directory_name. Ему может соответствовать физический каталог c:\somedirectory. Стандартному URL http://host_name/ по умолчанию соответствует каталог c:\inetpub\wwwroot. После запуска оснастки IISAdmin (Пуск → Программы → Администрирование → Internet Information Services) требуется выбрать пункт Веб-узел по умолчанию, в контекстном меню пункта выбрать Создать → Виртуальный каталог. Запустится Мастер создания виртуального каталога. Требуется указать имя для каталога (укажем remote) и соответствующую каталогу директорию на диске (c:\rem). В сформированной виртуальной директории необходимо создать подкаталог bin и поместить в него сборку с удаленным типом. Альтернативное решение заключается в размещении сборки в GAC, но помните, что для доступа к сборке будет необходимо использовать сильное имя.
Конфигурационный файл web.config, размещенный в каталоге c:\rem, выглядит следующим образом:
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton"
type="BSUIR.Calculator, Calc"
objectUri="Calculator.soap" />
</service>
</application>
</system.runtime.remoting>
</configuration>
В конфигурационном файле отсутствует описание канала (ISS-хостинг подразумевает HHTP и стандартный порт). При необходимости изменить форматер по умолчанию для HTTP-канала описание канала должно присутствовать. Также при указании концевой точки обязательно должен быть записан суффикс soap.
Конфигурационный файл клиента выглядит следующим образом:
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="BSUIR.Calculator, Calc"
url="http://localhost/remote/Calculator.soap" />
</client>
</application>
</system.runtime.remoting>
</configuration>