Методы:

 

       #region Основные

       /// <summary>

       /// Вход/Авторизация: "uploadservice.ashx/Login"

       /// </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>

       /// Выход: "uploadservice.ashx/Logout"

       /// </summary>

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

       public void Logout()

       {

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

       }

 

       /// <summary>

       /// Дата/Время на сервере: "uploadservice.ashx/GetServerDateTime"

       /// </summary>

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

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

       public DateTime GetServerDateTime()

       {

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

       }

 

       /// <summary>

       /// Тип хранилища: "uploadservice.ashx/GetStorageType"

       /// </summary>

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

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

       public string GetStorageType()

       { }

 

       /// <summary>

       /// Версия сервиса: "uploadservice.ashx/GetServiceVersion"

       /// </summary>

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

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

       public string GetServiceVersion()

       { }

 

       /// <summary>

       /// Максимально допустимый размер загружаемого на сервер файла (байт): "uploadservice.ashx/MaxUploadFileSize"

       /// </summary>

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

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

       [ApiAccess]

       public long MaxUploadFileSize()

       { }

       #endregion

 

 

       #region File

       /// <summary>

       /// Проверка существования файла: "uploadservice.ashx/FileExist"

       /// </summary>

       /// <param name="fileLink">Ссылка на файл.</param>

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

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

       [ApiAccess]

       public bool FileExist(string fileLink)

       { }

 

       /// <summary>

       /// Получить информацию о файле: "uploadservice.ashx/GetFileInfo"

       /// </summary>

       /// <param name="fileLink">Ссылка на файл.</param>

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

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

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

       [ApiAccess]

       public TransferFileInfo GetFileInfo(string fileLink, bool calcChecksum)

       { }

 

       /// <summary>

       /// Загрузить файл на сервер: "uploadservice.ashx/UploadFile"

       /// </summary>

       /// <param name="filePrefix">Префикс пути файла.</param>

       /// <param name="fileInfo">Параметры файла.</param>

       /// <param name="rewrite">Перезаписывать файл.</param>

       /// <param name="draft">Черновик.</param>

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

       [AcceptVerbs("POST")]

       [ApiAccess]

       public string UploadFile(string filePrefix, TransferFileInfo fileInfo, bool rewrite, bool draft)

       {

          Возвращается ссылка на файл.

          Параметры метода передаются в строке запроса в виде: ?filePrefix= &fileInfo.FileName= &fileInfo.Checksum= &fileInfo.Size= &rewrite= &draft=

          Содержимое файла передается в теле запроса.

       }

 

       /// <summary>

       /// Сохранить черновик в беловик: "uploadservice.ashx/SaveDraftFile"

       /// </summary>

       /// <param name="fileLink">Ссылка на файл.</param>

       /// <param name="rewite">Перезаписать, если файл уже существует.</param>

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

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

       [ApiAccess]

       public string SaveDraftFile (string fileLink, bool rewrite)

       {

          Возвращается новая ссылка на файл.

       }

 

       /// <summary>

       /// Скачать файл с сервера: "uploadservice.ashx/DownloadFile"

       /// </summary>

       /// <param name="fileLink">Ссылка на файл.</param>

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

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

       [ApiAccess]

       public Stream DownloadFile(string fileLink)

       { }

 

       /// <summary>

       /// Скачать файл с сервера: "uploadservice.ashx/ViewFile"

       /// </summary>

       /// <param name="fileLink">Ссылка на файл.</param>

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

       [AcceptVerbs("GET")]

       [ViewAccess]

       public Stream ViewFile(string fileLink)

       {

          ViewAccess – специальный атрибут, позволяющий просмотреть файл в браузере без авторизации, если логин и пароль пользователя в конфиг.файле сервиса не заданы.

       }

 

       /// <summary>

       /// Удалить файл на сервере: "uploadservice.ashx/DeleteFile"

       /// </summary>

       /// <param name="fileLink">Ссылка на файл.</param>

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

       [ApiAccess]

       public void DeleteFile(string fileLink)

       { }

       #endregion

 

 

 

       #region Crypto

       /// <summary>

       /// Вычислить хэш файла: "uploadservice.ashx/GetFileHash"

       /// </summary>

       /// <param name="fileLink">Ссылка на файл.</param>

       /// <param name="hashAlgOid">Алгоритм: 1.2.643.2.2.9 для ГОСТ R 34.11-94 | 1.3.14.3.2.26 для SHA-1.</param>

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

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

       public string GetFileHash(string fileLink, string hashAlgOid)

       {

          Пример GET запроса:

          http://localhost/UploadService/uploadservice.ashx/GetFileHash?fileLink=UPLOADS\2013\YM\20150921\e836cc3abd22c03d1d10a01725761999_90MByte.pdf&hashAlgOid=1.3.14.3.2.26

 

 

          Пример POST запроса:

          http://localhost/UploadService/uploadservice.ashx/GetFileHash

          Content-Type: application/x-www-form-urlencoded

 

          fileLink=UPLOADS\2013\YM\20150921\e836cc3abd22c03d1d10a01725761999_90MByte.pdf&hashAlgOid=1.3.14.3.2.26

      }

 

       /// <summary>

       /// Проверить подпись файла: "uploadservice.ashx/CheckFileSign"

       /// </summary>

       /// <param name="fileLink">Ссылка на файл.</param>

       /// <param name="signLink">Файл сигнатуры.</param>

       /// <param name="checkParams">Параметры проверки.</param>

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

       [AcceptVerbs("POST")]

       public IDictionary<string,string> CheckFileSign(string fileLink, string signLink, IDictionary<string,string> checkParams))

       {

          Параметры fileLink и signLink передаются в строке запроса в виде Url-кодированных строк.

          Параметр checkParams передается в теле запроса в виде Json строки с Content-Type: application/json.

          Если параметр signLink == null, т.е. не передан, то сигнатура в явном виде должна содержаться в checkParams.

       }

 

       /// <;t;summary>

       /// Проверить подпись данных: "uploadservice.ashx/CheckDataSign"

       /// </summary>

       /// <param name="checkParams">Параметры проверки.</param>

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

       [AcceptVerbs("POST")]

       public IDictionary<string,string> CheckDataSign(IDictionary<string,string> checkParams)

       { }

       #endregion

 

 

 

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

 

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

       class TransferFileInfo

       {

          FileAttributes Attributes; // Атрибуты файла.

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

          DateTime CreationTime;     // Время создания файла.

          string FileName;           // Имя файла или путь к файлу или ссылка на файл.

          DateTime LastAccessTime;   // Время последнего обращения к файлу.

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

          bool LoadCompleted;        // Файл загружен полностью.

          long Size;                 // Размер файла.

          Version Version;           // Версия файла.

       }

  

       // "Параметры проверки подписи"

       IDictionary<string,string>

       {

          stringing CertUsageOids;

          bool CheckRevocation;

          string NeedServiceVersion;

          int SecretKeyValidity;

          int UrlRetrievalTimeout;

          string ValidationTime;      // Формат: "yyyy-MM-dd HH:mm:ss"

       }

 

       // "Результат проверки подписи"

       IDictionary<string,string>

       {

          stringing CadesMessage;

          byte[] Certificate;

          string ChainMessage;

          uint ErrorCadesCode;

          uint ErrorChainCode;

          uint ErrorMathCode;

          string ExtendedInfo;

          string Fio;

          bool IsCadesValid;

          bool IsChainValid;

          bool IsMathValid;

          string Issuer;

          string IssuerX500;

          string MathMessage;

          string Message;

          string OrganizationName;

          string Serial;

          string Subject;

          string SubjectX500;

          string Version;

       }