Методы:

 

       #region Основные

       /// <summary>

       /// Вход/Авторизация.

       /// </summary>

       /// <param name="userName">Имя.</param>

       /// <param name="password">Пароль.</param>

       /// <returns></returns>

       [AcceptVerbs("POST")]

       public HttpStatus Login(string userName, string password)

       {

          Если на сервисе включена Forms авторизация, то

          для вызова защищенных атрибутом [ApiAccess] методов, необходимо пройти процедуру авторизации.

          При удачной проверке имени пользователя и пароля, возвращается зашифрованная кука, которая должна

          в последующем передаваться на сервер при каждом вызове защищенного метода сервиса.

          Если проверка не прошла, возвращается статус (403) Forbidden.

 

          Так же поддерживается Basic авторизация, при которой параметры авторизации передаются с каждым запросом

          в заголовке Authorization в формате «Basic userName:password», где строка userName:password закодирована в Base64.

          Если проверка не прошла, то возвращается статус (401) Unauthorized.

       }

 

       /// <summary>

       /// Выход.

       /// </summary>

       [AcceptVerbs("GET","POST")]

       public void Logout()

       {

             Удаляется кука авторизации.

       }

 

       /// <summary>

       /// Дата/Время на сервере.

       /// </summary>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       public DateTime GetServerDateTime()

       {

          Возвращается Дата/Время сервера в ISO формате.

       }

 

       /// <summary>

       /// Версия сервиса.

       /// </summary>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       public string GetServiceVersion()

       { }

 

       /// <summary>

       /// Начать процесс обновления.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <param name="version">Версия.</param>

       [AcceptVerbs("POST")]

       [ApiAccess]

       public void UpdateBegin(string appName, string version)

       { }

 

       /// <summary>

       /// Окончить процесс обновления.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <param name="version">Версия.</param>

       [AcceptVerbs("POST")]

       [ApiAccess]

       public void UpdateEnd(string appName, string version)

       { }

       #endregion

 

 

       #region Application

       /// <summary>

       /// Список приложений.

       /// </summary>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public List<string> GetAppNames()

       { }

 

       /// <summary>

       /// Подробный список приложений.

       /// </summary>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public List<AppInfo> GetApplications()

       { }

 

       /// <summary>

       /// Информация о приложении.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public AppInfo GetAppInfo(string appName)

       { }

 

       /// <summary>

       /// Получить иконку приложения.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <returns>Content-Type: image/???</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public Stream GetAppImage(string appName)

       { }

       #endregion

 

 

       #region Version

       /// <summary>

       /// Список версий.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public List<string> GetVersionNames(string appName)

       { }

 

       /// <summary>

       /// Подробный список версий.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public List<AppVersionInfo> GetVersions(string appName)

       { }

 

       /// <summary>

       /// Информация о версии.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

        /// <param name="version">Версия.</param>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public AppVersionInfo GetVersionInfo(string appName, string version)

       { }

 

       /// <summary>

       /// Скачать архив с файлами версии.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <param name="version">Версия.</param>

       /// <returns>Content-Type: application/zip</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public Stream DownloadVersion (string appName, string version)

       { }

       #endregion

 

 

       #region File

       /// <summary>

       /// Список файлов.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <param name="version">Версия.</param>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public List<string> GetFileNames(string appName, string version)

       { }

 

       /// <summary>

       /// Подробный список файлов.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <param name="version">Версия.</param>

       /// <param name="calcChecksum">Вычислить контрольную сумму.</param>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public List<AppFileInfo> GetFiles(string appName, string version, bool? calcChecksum)

       { }

 

       /// <summary>

       /// Информация о файле.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <param name="version">Версия.</param>

       /// <param name="fileName">Имя файла.</param>

       /// <param name="calcChecksum">Вычислить контрольную сумму.</param>

       /// <returns>Content-Type: application/json</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public AppFileInfo GetFileInfo(string appName, string version, string fileName, bool? calcChecksum)

       { }

 

       /// <summary>

       /// Скачать файл.

       /// </summary>

       /// <param name="appName">Имя приложения.</param>

       /// <param name="version">Версия.</param>

       /// <param name="fileName">Имя файла.</param>

       /// <param name="zip">Сжимать файл при загрузке.</param>

       /// <returns>Content-Type: application/octet-stream</returns>

       [AcceptVerbs("GET", "POST")]

       [ApiAccess]

       public Stream DownloadFile(string appName, string version, string fileName, bool? zip)

       {

          Сжимать или не сжимать файл определяется параметром запроса "zip".

          Если он не передан (равен null), то сжатие определяется заголовком запроса "Accept-Encoding".

          Если он содержит значение "gzip", то файл сжимается.

       }

       #endregion

 

 

       Структуры данных:

 

       // "Информация о приложении"

       class AppInfo

       {

             string AppName;                // Имя приложения

             List<AppVersionInfo> Versions; // Список версий

       }

 

       // "Информация о версии"

       class AppVersionInfo

       {

             string Version;                // Версия

             int FilesCount;                // Кол-во файлов

             long TotalSize;                // Размер всех файлов

       }

 

       // "Информация о файле"

       class AppFileInfo

       {

             string RelativeName;           // Относительное имя

             string Version;                // Версия

             string Checksum;               // Контрольная сумма

             string Attributes;             // Атрибуты

             long Size;                     // Размер

             DateTime LastWriteTime;        // Время последней модификации

       }