Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом.pdf
Скачиваний:
23
Добавлен:
23.03.2015
Размер:
1.25 Mб
Скачать

которой необходимо получить выгрузку из реестров в формате string. В ответ присылает result — результат обработки запроса в boolean формате и если все удачно, то registerZipArchive — файл zip-архив с выгрузкой из реестров в формате base64Binary. Так же resultComment — комментарий к результату обработки запроса в формате string.

Логика проста: Получаем временную метку последнего обновления реестров, если она изменилась, то направляем запрос на получение выгрузки из реестров, если все удачно, то через 10 минут забираем наш дамп реестров.

Данную логику реализуют соответствующие три функции. Из нюансов реализации стоит отметить, что метод getResult возвращает файл дампа реестров, который на данный момент весит более 150 кбайт и судя по всему будет увеличиваться. По этой причине свойство MaxReceivedMessageSize объекта класса BasicHttpBinding должно быть больше размера принимаемых данных. В проекте задал его значения в 1Гб.

BasicHttpBinding HttpBinding = new BasicHttpBinding(); HttpBinding.MaxReceivedMessageSize = 1073741824; //1Gb = 1`073`741`824 байт

Так же интересна функция перевода числа из метода getLastDumpDate в формат даты и времени.

Int64 lastDumpDate = getLastDumpDate();

DateTime LastDumpDate = (new DateTime(1970, 1, 1, 0, 0, 0, 0))

.AddSeconds(lastDumpDate / 1000);

2.3 Разбор дампа реестров

После получения реестра необходимо выполнить следующий шаг – это разобрать его и применить ограничения.

Дамп реестра передается в виде ZIP архива. Ввиду этого необходимо сначала разархивировать. Для этого используем класс ZipFile. Файлы дампа

19

реестров распаковываются во временную директорию. Файл дампа имеет следующий вид:

<?xml version="1.0" encoding="windows-1251"?>

<reg:register updateTime="2013-12-24T13:30:00+04:00" xmlns:reg="http://rsoc.ru" xmlns:tns="http://rsoc.ru">

<content id="60" includeTime="2012-01-02T05:05:05">

<decision date="2012-01-01" number="Решение №1" org="ФОИВ №1"/> <domain><![CDATA[chelaxe.ru]]></domain>

<ip>91.201.52.97</ip> <ip>46.45.15.123</ip>

</content>

<content id="68" includeTime="2012-02-02T01:01:01">

<decision date="2012-01-01" number=" Решение №2" org="ФОИВ №2"/> <url><![CDATA[http://eu.iit.csu.ru/login/index.php]]></url> <url><![CDATA[http://eu.iit.csu.ru/course/index.php]]></url> <ip>195.54.14.133</ip>

</content> </reg:register>

Переменные в файле:

-updateTime – время формирования дампа реестров с указанием временной зоны;

-id – идентификатор записи;

-includeTime – дата и время добавления в реестр;

-date – дата решения о внесении в реестр;

-number – номер решения о внесении записи в реестр;

-org – организация принявшая решение о внесении записи в реестр;

-url – URL адрес, доступ к которому необходимо ограничить. Может быть несколько или вообще отсутствовать;

-domain – домен, доступ к которому необходимо ограничить. Может быть несколько или вообще отсутствовать;

-ip – ip адрес, доступ к которому необходимо ограничить. Может быть несколько или вообще отсутствовать.

20

Зная изначально конструкцию дампа реестров были разработаны ряд классов. Класс RegisterDump со свойством UpdateTime и Items. Items это список всех внесенных в дамп записей.

public class RegisterDump

{

public List<ItemRegisterDump> Items { get; set; } public String UpdateTime { get; set; }

public RegisterDump()

{

this.Items = new List<ItemRegisterDump>(); this.UpdateTime = String.Empty;

}

}

Items имеет тип ItemRegisterDump. ItemRegisterDump это класс содержащий параметры записи. Причем записи ip, domain, url являются списками.

public class ItemRegisterDump

{

public String id { get; set; }

public String includeTime { get; set; } public String date { get; set; }

public String number { get; set; } public String org { get; set; } public List<String> url { get; set; }

public List<String> domain { get; set; } public List<String> ip { get; set; } public ItemRegisterDump()

{

this.id = this.includeTime = this.date = this.number = this.org = String.Empty; this.url = this.domain = this.ip = new List<String>();

}

}

Далее объект класса RegisterDump заполняется данными из дампа реестров. Для этого используется компонент XmlDocument, который позволяет разбирать xml документы. Полный разбор файла дампа реестров выглядит так:

RegisterDump Register = new RegisterDump();

String dumpfile = @"dump.xml";

21

XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(dumpfile); Register.UpdateTime =

xmlDoc.GetElementsByTagName("reg:register")[0].Attributes.GetNamedItem("upd ateTime").InnerText;

XmlNodeList content = xmlDoc.GetElementsByTagName("content"); for (int i = 0; i < content.Count; i++)

{

ItemRegisterDump item = new ItemRegisterDump();

item.id = content[i].Attributes.GetNamedItem("id").InnerText;

item.includeTime = content[i].Attributes.GetNamedItem("includeTime").InnerText; foreach (XmlNode node in content[i].ChildNodes)

{

switch (node.Name)

{

case "decision":

item.date = node.Attributes.GetNamedItem("date").InnerText; item.number = node.Attributes.GetNamedItem("number").InnerText; item.org = node.Attributes.GetNamedItem("org").InnerText; break;

case "url": item.url.Add(node.InnerText); break;

case "domain": item.domain.Add(node.InnerText); break;

case "ip": item.ip.Add(node.InnerText); break;

}

}

Register.Items.Add(item);

}

Теперь весь дамп реестров содержится в объекте класса RegisterDump и его, возможно, использовать дальше для ограничения доступа.

Весь основной процесс формирования запроса, подписи его, выгрузка дампа реестров и разбор его представлен на схеме в Приложении A.

22