ADN Open CIS
Сообщество программистов Autodesk в СНГ

18/01/2016

Ошибка 8000 при получении файла из AVFS

В некоторых случаях код, загружающий файл из Autodesk Data Management Server (ADMS), может вернуть ошибку 8000 (TIckerInvalid), в то время как такой же код, вызываемый из другого исполняемого файла, корректно работает с AVFS. Код моделирует работу из пользовательской задачи.

Решение (от коллеги из отдела разработчиков Vault)

Короткий ответ:

Вход в службу AVFS с билетом, полученным от входа в другую AVFS, не поддерживается.

Необходимо заменить вызов DataServer на FileServer, т.е. вместо:

arguments += "/url \"" + loginCred.ServerIdentities.DataServer + "\" ";

использовать конструкцию

arguments += "/url \"" + loginCred.ServerIdentities.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://adndevblog.typepad.com/manufacturing/2015/08/8000-error-getting-file-from-avfs-use-fileserver-instead-of-dataserver.html

Автор перевода: Дмитрий Емельянов

Обсуждение: http://adn-cis.org/forum/index.php?topic=3339

Опубликовано 18.01.2016
Отредактировано 27.01.2016 в 18:26:11