Web-сервисы: Сервис по загрузке поисковых фильтров — различия между версиями
| [досмотренная версия] | [досмотренная версия] |
Porunova (обсуждение | вклад) (→Описание класса SchemeNode) |
Biryukov (обсуждение | вклад) |
||
| Строка 33: | Строка 33: | ||
==Настройка== | ==Настройка== | ||
После установки «Сервис по загрузке поисковых фильтров» доступен по адресу: | После установки «Сервис по загрузке поисковых фильтров» доступен по адресу: | ||
| − | * http://ip- адрес сервера Мастер-Веб/FilterBinding/FilterBindingService.asmx (обращение к сервису происходит путем передачи ему SOAP-сообщения) | + | * http://ip- адрес сервера Мастер-Веб/FilterBinding/FilterBindingService.asmx (обращение к сервису происходит путем передачи ему SOAP-сообщения) |
| − | + | ||
==Подготовка данных== | ==Подготовка данных== | ||
===Сигнатура вызова=== | ===Сигнатура вызова=== | ||
====FilterBindingService.asmx /GetFilter==== | ====FilterBindingService.asmx /GetFilter==== | ||
| − | |||
public HybridArrayDictionary<SchemeNodeBase, IList> GetFilter(List<SchemeNodeBase> nodes, SchemeNode changedNode, BindType bindType) | public HybridArrayDictionary<SchemeNodeBase, IList> GetFilter(List<SchemeNodeBase> nodes, SchemeNode changedNode, BindType bindType) | ||
| − | |||
| − | |||
| − | |||
===Формат данных=== | ===Формат данных=== | ||
| Строка 305: | Строка 301: | ||
</soap:Envelope></nowiki> | </soap:Envelope></nowiki> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
[[Category:Web-сервисы]] | [[Category:Web-сервисы]] | ||
Текущая версия на 11:29, 15 августа 2019
Введение
Данный модуль предназначен для формирования поискового фильтра, т.е. позволяет при изменении какого-либо из критериев отбора туров определить возможные значения зависимых от него критериев.
Ссылка на тестовый сервис
С работой тестового сервиса по загрузке поисковых фильтров вы можете ознакомиться на нашем демо-сервере.
Установка
Для установки Сервиса по загрузке поисковых фильтров нужно создать директорию FilterBinding в каталоге c:/inetpub/wwwroot/ (корневом каталоге IIS) и выложить туда распакованные файлы из архива mw-filterbinding-2007.2.XX.XXXX.zip. В управлении IIS необходимо создать виртуальный каталог для папки FilterBinding.
Создание виртуального каталога
По умолчанию корневым каталогом IIS является C:/Inetpub/wwwroot. Для создания виртуального каталога для приложения находящегося в этом каталоге нужно выполнить следующие действия:
- 1. Зайти в Пуск (Start) – Настройки (Settings) – Панель управления (Control Panel)
- 2. В открывшемся окне выбрать Администрирование (Administrative Tools)
- 3. Запустить Internet Information Services (IIS) Manager
- 4. В открывшемся дереве каталогов выбрать Web Sites – Default Web Site. В открывшемся списке найти папку, для которой нужно создать виртуальный каталог, кликнуть по ней правой кнопкой мыши и зайти в Свойства (Properties)
- 5. В открывшемся окне, в закладке Directory нужно нажать кнопку «Create», а затем кнопку «ОК»
Подключение к базе данных ПК «Мастер-Тур»
В файле web.config, расположенном в папке FilterBinding пропишите необходимые параметры подключения (курсивом выделены значения, которые необходимо ввести).
Строка подключения к базе данных ПК «Мастер-Тур»:
<add key = "connectionString" value = "Data Source=ip-адрес сервера базы данных ПК Мастер-тур;Initial Catalog=название базы данных ПК Мастер-тур;User ID=логин пользователя ПК Мастер-тур;Password=пароль пользователя ПК Мастер-тур"/>
При использовании репликации в строке подключения необходимо указать подключение к поисковой базе. Настройка searchConnectionString веб-сервисом не поддерживается.
Настройка
После установки «Сервис по загрузке поисковых фильтров» доступен по адресу:
- http://ip- адрес сервера Мастер-Веб/FilterBinding/FilterBindingService.asmx (обращение к сервису происходит путем передачи ему SOAP-сообщения)
Подготовка данных
Сигнатура вызова
FilterBindingService.asmx /GetFilter
public HybridArrayDictionary<SchemeNodeBase, IList> GetFilter(List<SchemeNodeBase> nodes, SchemeNode changedNode, BindType bindType)
Формат данных
Описание класса HybridArrayDictionary
/// <summary>
/// Класс, реализующий часть функционала Hashtable,
/// но не реализует интерфейс IDictionary,
/// что дает возможность передавать его в XMLSerializer
/// </summary>
/// <typeparam name="T1">Класс для ключа</typeparam>
/// <typeparam name="T2">Класс для значения</typeparam>
public class HybridArrayDictionary<T1, T2>
{
/// <summary>
/// Массив хранимых объектов
/// </summary>
[XmlElement("HybridArrayDictionary")]
public List<Pair<T1, T2>> Items { get; set; }
public HybridArrayDictionary(){ }
public HybridArrayDictionary(IDictionary<T1, T2> dict) { }
public Dictionary<T1, T2> ToDictionary(){ }
/// <summary>
/// Добавление элемента в коллекцию
/// </summary>
/// <param name="key">Ключ</param>
/// <param name="value">Значение</param>
public void Add(T1 key, T2 value) { }
/// <summary>
/// Удаление элемента из коллекции
/// </summary>
/// <param name="key">Ключ удаляемого элемента</param>
public void Remove(T1 key) { }
/// <summary>
/// Проверка наличия элемента с заданным ключом
/// </summary>
/// <param name="key">Ключ элемента</param>
/// <returns></returns>
public bool Contains(T1 key) { }
/// <summary>
/// Доступ к значению элемента по ключу
/// </summary>
/// <param name="key">Ключ элемента</param>
/// <returns>Значение элемента</returns>
public T2 this[T1 key] { get; set; }
/// <summary>
/// Список ключей элементов, имеющихся в коллекции
/// </summary>
[XmlIgnore]
public ArrayList Keys { get; }
}
Описание класса SchemeNode
Внимание! При передаче в запросе значения (Value) категории отеля (lstCategory) необходимо указывать Наименование, а не ключ данной категории.
Сервис возвращает ключ тура из поля TO_Key (ключ рассчитанного тура). Если необходимо возвращать ключ тура из поля TO_TRKey (ключ тура из справочника),
то в web.config нужно добавить настройку <add key="quotedDynamicPriceTour" value="false"/>.
/// <summary>
/// Класс, представляющий собой узел поискового фильтра
/// </summary>
public class SchemeNode : SchemeNodeBase
{
/// <summary>
/// Имя сборки, содержащей лоадеры
/// </summary>
public override string Assembly { get; set; }
/// <summary>
/// Вызывает ли изменение состояния узла отправку запроса на сервер
/// </summary>
public override bool AutoPostBack { get; set; }
/// <summary>
/// Коллекция узлов, зависящих от данного узла
/// </summary>
public override List<SchemeNodeBase> ChildNodes { get; }
/// <summary>
/// Список узлов, зависящих от данного узла в формате [node1name][node2name]...[nodeNname]
/// </summary>
public string ChildNodesString { get; set; }
/// <summary>
/// Поле контрола, содержащее отображаемый текст
/// </summary>
public override string DataTextField { get; set; }
/// <summary>
/// Поле контрола, содержащее значение
/// </summary>
public override string DataValueField { get; set; }
/// <summary>
/// Текст отображаемый у первого элемента списка (например "Все")
/// </summary>
public override string FirstItem { get; set; }
/// <summary>
/// Имя контрола, который отображает содержимое узла
/// </summary>
public override string Name { get; set; }
/// <summary>
/// Имя контрола, который расположен на уровень выше по иерархии зависимостей узлов
/// </summary>
public override string ParentControlName { get; set; }
/// <summary>
/// Коллекция узлов, от которых зависит узел
/// </summary>
public override List<SchemeNodeBase> ParentNodes { get; }
/// <summary>
/// Список узлов, от которых зависит узел в формате [node1name][node2name]...[nodeNname]
/// </summary>
public string ParentNodesString { get; set; }
/// <summary>
/// Поле БД, по которому будет произведена сортировка
/// </summary>
public override string Sort { get; set; }
/// <summary>
/// Коллекция пар [имя источника]-[ключ в БД источника]
/// </summary>
public override Hashtable SourceValues { get; set; }
/// <summary>
/// Тип узла поискового фильтра
/// Возможные значения: DepartFrom, Country, TourType, Resort,
/// City, Tour, Hotel, Room, Nights, HotelStars, Pansion,
/// CalendarTourDates, CalendarTourDatesJs
/// </summary>
public override string Type { get; set; }
/// <summary>
/// Значение поискового узла
/// </summary>
public override string Value { get; set; }
/// <summary>
/// Восстановление связей между узлами
/// (заполнение ParentNodes и ChildNodes на основании ParentNodesString и ChildNodesString)
/// </summary>
/// <param name="nodes"></param>
public void RestoreRelations(ICollection nodes)
}
Описание перечисления BindType
/// <summary>
/// Тип бинда
/// </summary>
public enum BindType
{
//первая
First,
//контрол изменился
ControlChanged,
//загрузка по умолчанию
Default
}
Работа в системе
Пример вызова
Пример SOAP-запроса к сервису
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetFilter xmlns="http://megatec.ru/">
<nodes>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstDepartFrom" Value="" Type="DepartFrom" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="" FirstItemContainer="" Sort="sd_ctfromname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString />
<ChildNodesString>[lstCountry]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstCountry" Value="" Type="Country" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="" FirstItemContainer="" Sort="sd_cnname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom]</ParentNodesString>
<ChildNodesString>[lstTourType]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstTourType" Value="" Type="TourType" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_tourtypename" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry]</ParentNodesString>
<ChildNodesString>[lstResort]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstResort" Value="" Type="Resort" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_rsname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstTourType]</ParentNodesString>
<ChildNodesString>[lstCity]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstCity" Value="" Type="City" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_ctname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstTourType][lstResort]</ParentNodesString>
<ChildNodesString>[lstTour]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstTour" Value="" Type="Tour" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="true"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_tourcreated desc" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstTourType][lstResort][lstCity]</ParentNodesString>
<ChildNodesString>[lstHotel][lstDuration][lstCategory][lstBoard][lstCalendarTourDates]</ChildNodesString>
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstHotel" Value="" Type="Hotel" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_hdname" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstDuration" Value="" Type="Nights" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_nights" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstCategory" Value="" Type="HotelStars" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="sd_hdstars" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstBoard" Value="" Type="Pansion" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="All" FirstItemContainer="" Sort="pn_code" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
<SchemeNodeBase xsi:type="SchemeNode" Name="lstCalendarTourDates" Value="" Type="CalendarTourDates" Assembly="Megatec.MasterWeb.Loading" AutoPostBack="false"
DataTextField="Name" DataValueField="SearchID" FirstItem="" FirstItemContainer="" Sort="td_date" ParentControlName="" Bind="true">
<TypeDependencies />
<DefaultSelect xsi:type="DefaultSelection" />
<ParentNodesString>[lstDepartFrom][lstCountry][lstResort][lstCity][lstTourType][lstTour]</ParentNodesString>
<ChildNodesString />
</SchemeNodeBase>
</nodes>
<bindType>Default</bindType>
</GetFilter>
</soap:Body>
</soap:Envelope>
