Ошибка 8000 при получении файла из AVFS
В некоторых случаях код, загружающий файл из Autodesk Data Management Server (ADMS), может вернуть ошибку 8000 (TIckerInvalid), в то время как такой же код, вызываемый из другого исполняемого файла, корректно работает с AVFS. Код моделирует работу из пользовательской задачи.
Решение (от коллеги из отдела разработчиков Vault)
Короткий ответ:
Вход в службу AVFS с билетом, полученным от входа в другую AVFS, не поддерживается.
Необходимо заменить вызов DataServer на FileServer, т.е. вместо:
использовать конструкцию
Детальный ответ:
DataServer и FileServer - это строки, представляющие соответственно расположение служб ADMS и AVFS. В случае сервера ADMS, DataServer и FileServer имеют одинаковые значения, поскольку ADMS всегда имеет как ADMS, так и AVFS службы. Однако для сервера AVFS, FileServer и DataServer будут отличаться. AVFS-сервер всегда знает, какому серверу ADMS он принадлежит.
Допустим, в нашей системе существуют службы ADMS1 и AVFS1 на Server1 и AVFS2 (которая общается с ADMS1) на Server2.
Первый процесс, Process1, регистрируется в AVFS2. Таким образом, его FileServer будет Server2, а его DataServer будет Server1. В процессе входа он получает заголовок безопасности, который имеет Ticket, Т1, который связан с AVFS2 (это важная часть - эти билеты являются специфическими для AVFS, в которые вы вошли).
Затем запускается второй процесс - Process2, которому передаем (среди всего прочего) Т1 и DataServer(т.е. Server1). Эта информация используется в конструкторе UserIdTicketCredentials. Конструктор предполагает, что гиперссылка, которую вы ему передаете - это адрес AVFS, в который вы желаете войти. Таким образом, это регистрирует вас вAVFS1 на Server1 (и я предполагаю, не было предусмотрено).
Это работает (немного), потому что билет действителен, даже если билет не связан с AVFS1.
Выгрузка/скачивание билетов специфично для AVFS (т.е. загрузка/выгрузка билета для одного AVFS не будет работать с другим AVFS). Когда вы отправляете запрос службе ADMS о выгрузке/загрузке билета, он использует билет заголовка безопасности для того чтобы узнать, c каким AVFS должен быть связан билет. В этой ситуации, основанной на билете SecurityHeader, он думает, что вы желаете загрузить билет, связанный с AVFS2.
Когда вы получите этот билет обратно и используете его, он используется с AVFS1, и AVFS1 отвергает билет, потому что это не тот билет, который он ожидает (это не билет, связанный с AVFS1). Следовательно, сообщение об ошибке 8000 является верным.
Было бы лучше (в моём случае - для устранения неполадок), если бы мы просто отклоняли вход от получения-перехода, но мы этого не делаем.
В этой статье блога JustOnesAndZeros обсуждаются передача файлов:
http://justonesandzeros.typepad.com/blog/2013/07/file-transfer-doing-it-the-hard-way.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=3339
Опубликовано 18.01.2016Отредактировано 27.01.2016 в 18:26:11