В архиве находится тестовый пример. Для запуска необходимо заполнить параметры лицензирования в класс LicenseSettings.
wsexample2.zip

Чтобы начать работать с White Server, необходимо:

1. Получить логин(userName), пароль(password), токен(token) в отделе лицензирования.

2. Получить объект агрегатора, объект ресторана и абстрактный софт(продукт), если их нет, в отделе лицензирования.

3. Получить лицензии. Подробнее о том, как получить лицензии: Порядок создания и проверки лицензий

4. Настроить агент. Подробнее о том, как настроить агент: Настройка WhiteServer Agent

5. Заменить данные в файле на wsexample\WSExample\Client\Models\LicenseSettings.cs(в примере из архива) на полученные.

Для Авторизации необходимо отправить POST запрос на адрес http://white_server_address/wsserverlp/api/client/login такого вида:

<?xml version="1.0" encoding="utf-8"?>
<AUTHCMD key="LicenseCode" usr="usr"/>

LicenseCode: выданный код лицензии;
usr: Base64(userName + “;” + lowercase(hPassword) + “;” + lowercase(md5(token)));
hPassword – вычисляется как MD5(userName+password);
userName, password - дилерский логин/пароль;
token - токен лицензирования.

В ответ вернется xml вида:

<Error code="0" Text="Ok" />

В запросе вернется cookie - идентификатор сессии, которую необходимо использовать в последующих запросах.

Отправляем POST запрос на http://white_server_address/wsserverlp/api/client/cmd, вкладывая полученную cookie.

        public string SendXmlCommand(Aggregator aggregator)
        {   
            //текст запроса       
            var testString = @"<RQ cmd = ""get_objects""/>";
            var response = new ServerResponse();
            try
            {
                response = DataSender.SendDataToServer(LicenseSettings.WhiteServerUrl + "/api/client/cmd", requestString, aggregator.Cookie, "text/xml");
                Console.WriteLine("Response: " + response.ResponseString);
                return response.ResponseString;
            }
            catch (Exception exception)
            {
 
                Console.WriteLine("SendXmlCommands catch: " + exception.Message + " ResponseString:" + response.ResponseString);
            }
            return null;
        }

Отправка синхронной команды происходит аналогично синхронной, но добавляется атрибут callback, в котором необходимо указать адрес сервиса, принимающего колбэк. В ответ на запрос придет xml c taskguid (подробней см. описание методов), а на адрес, указанный в callback - асинхронный ответ.

        public string SendXmlCommand(Aggregator aggregator)
        {   
            //текст запроса       
             var testString = @"<RQ cmd = ""exec_rk7call"" tasktype = ""any_call"" callback = ""%%_Callback_%%"">
                                    <PARAM name = ""object_id"" val = ""%%_ObjectCode_%%""/>    
                                    <RK7Query>      
                                        <RK7CMD CMD = ""GetSystemInfo""/>      
                                    </RK7Query>
                                </RQ>";
        //LicenseSettings - статический класс, в котором хранятся настройки: id агента, дилерские логин и пароль, адрес WS и 
        // AggregatorServerUrl - адрес, куда будут приходить колбэки 
            var requestString = testString.Replace("%%_ObjectCode_%%", LicenseSettings.AgentId)
                .Replace("%%_Callback_%%", LicenseSettings.AggregatorServerUrl+ "/api/callbacks/save");
 
            var response = new ServerResponse();
            try
            {
                response = DataSender.SendDataToServer(LicenseSettings.WhiteServerUrl + "/api/client/cmd", requestString, aggregator.Cookie, "text/xml");
                Console.WriteLine("Response: " + response.ResponseString);
                return response.ResponseString;
            }
            catch (Exception exception)
            {
 
                Console.WriteLine("SendXmlCommands catch: " + exception.Message + " ResponseString:" + response.ResponseString);
            }
            return null;
        }