TinCan/xAPI - запрос на возобновление работы не работает

Я создал свою собственную простую LMS в ColdFusion. Он просто использует iframe для отображения курса, и есть страница, на которой записаны операторы консервной банки. Он отлично работает, но у меня есть курс, разработанный в Studio '13/ Presenter '13, вывод tincan, что функция возобновления не работает на моей LMS.

Если я использую presentation.html, пример

https://www.domainname.com/folder/courses/example_course/presentation.html?&actor={"name":["My_Name"],"mbox":["mailto:email@email.com"],"objectType":["Agent"]}&endpoint=https://www.domainname.com/folder/courses/&course_id=5&uuid=9AE6DEA4-9C19-F477-19B9822F1E2F0722&registration=36fc1ee0-2849-4bb9-b697-71cd4cad1b6e&activity_id=https://www.domainname.com/folder/courses/&auth=Basic TG9naW46UGFzc3dvcmQ=

резюме не работает, но заявления Tincan отправляются на мой сайт должным образом.

Если я использую presentation_html5.html, пример

https://www.domainname.com/folder/courses/example_course/presentation_html5.html?&actor={"name":["My_Name"],"mbox":["mailto:email@email.com"],"objectType":["Agent"]}&endpoint=https://www.domainname.com/folder/courses/&course_id=5&uuid=9AE6DEA4-9C19-F477-19B9822F1E2F0722&registration=36fc1ee0-2849-4bb9-b697-71cd4cad1b6e&activity_id=https://www.domainname.com/folder/courses/&auth=Basic TG9naW46UGFzc3dvcmQ=

резюме работает, но заявления Тинкана не публикуются.

Я следовал руководству и настроил функцию возобновления: http://www.articulate.com/support/presenter-09/enabling-and-disabling-the-prompt-to-resume-function

Я пробовал курс на нескольких разных веб-сайтах на нескольких разных серверах и в нескольких разных браузерах (IE 11, FF 34.0.5, Chrome 39.0.2171.95 m), текущей версии Flash.

Функция возобновления не работает.

Я пробовал курс со всеми различными опциями, подсказками и т. Д., Флеш-куки включены и отключены.

Функция возобновления не работает.

Я пробовал курс по Scorm Cloud. Функция резюме работает! Я открыл презентацию.html на моем компьютере в FireFox. Функция резюме работает.

Я сузил вопрос до TinCan. Если я отключу TinCan в файле presentation.html, изменив

var g_bTinCan = true; to var g_bTinCan = false;

Курс возобновляется, как и должно быть. Но поскольку TinCan отключен, он не публикует никаких заявлений в моей LMS.

Я понял, что мне, вероятно, нужно ответить на состояние POST? Method=GET с данными состояния / возобновления. Так как то так

1Nk30a010904050607080b0on1001811f016110171101811000 (указывает курс на слайд 4 или что-то в этом роде).

Я понимаю, что данные закодированы / сжаты. Данные фактически поступают из данных о состоянии, опубликованных в СУО. Каждый слайд публикует точку возобновления. Я предполагаю, что мне просто нужно получить эти данные точек возобновления из предыдущего сеанса и отправить обратно, когда пользователь возобновит курс, и Tincan запросит данные возобновления.

Но по какой-то причине, независимо от того, что я возвращаю и как я это возвращаю. Мой курс просто сидит и загружается. Все есть, навигационная панель, дополнительные функции курса, кнопка выхода, только содержание имеет знак загрузки. Ничто не кликабельно.

Я попытался опубликовать похожие заголовки, которые использует облако scorm в ColdFusion:

Access-Control-Allow-Header: Content-Type,Content-Length,Authorization,If-Match,If-None-Match,X-Experience-API-Version,X-Experience-API-Consistent-Through
Access-Control-Allow-Origin: *
Access-Control-Expose-Header: ETag,Last-Modified,Cache-Control,Content-Type,Content-Length,WWW-Authenticate,X-Experience-API-Version,X-Experience-API-Consistent-Through
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json
X-Experience-API-Version: 1.0.0
access-control-allow-methods: HEAD,GET,POST,PUT,DELETE

Они правильно проходят вместе с ответом: 1Nk30a010904050607080b0on1001811f016110171101811000

Я пробовал формат возврата как JSON, простой текст, массив. Но курс не загружается. Я также обнаружил странное поведение, если я обновляюсь, а затем немедленно останавливаю браузер (курс никогда не обновляется). Появится запрос на возобновление, и затем я могу нажать Да / Нет. И это работает. Очевидно, что это не так.

Есть идеи? Что мне не хватает? Я ищу то, что ожидает курс Articulate в качестве ответа от моей (или любой) LMS/LRS, когда он запрашивает точку возобновления в состоянии? Method=GET.

редактировать

@Brian: тип контента это приложение / JSON

LRS должен возвращать Content-Type в том виде, в котором он был получен. Здесь все становится сложнее. state?method=GET перенаправляет в функцию cfc. ../includes/LRSCFC.cfc?method=GetState&returnFormat=plain

Это функция:

<cfheader name="Access-Control-Allow-Header" value="Content-Type,Content-Length,Authorization,If-Match,If-None-Match,X-Experience-API-Version,X-Experience-API-Consistent-Through">
<cfheader name="Access-Control-Allow-Origin" value="*">
<cfheader name="Access-Control-Expose-Header" value="Last-Modified,Cache-Control,Content-Type,Content-Length,WWW-Authenticate,X-Experience-API-Version,X-Experience-API-Consistent-Through">
<cfheader name="Cache-Control" value="no-cache">
<cfheader name="Connection" value="keep-alive">
<cfheader name="Content-Type" value="application/json">
<cfheader name="X-Experience-API-Version" value="1.0.0">
<cfheader name="access-control-allow-methods" value="HEAD,GET,POST,PUT,DELETE">
<cfreturn '1s43040ji1001111a0101101111000'>

Проблема состоит в том, что если CF сказать, чтобы он возвращался как json, используя функцию returnFormat=json или serializeJSON(). Это добавляет вещи к возвращенным данным.

Код выше вернется:

1s43040ji1001111a0101101111000

говоря CF использовать json:

//"1s43040ji1001111a0101101111000"

Что является безопасной особенностью CF.

Но что смущает меня, так это то, что Scorm Cloud просто возвращается

1s43040ji1001111a0101101111000

Он не отформатирован как JSON. Кажется, что это простой текст, хотя Content-Type - это application/json.

Если я возвращаю всю информацию cfheader, но оставляю cfreturn пустым, cfreturn "", курс просто сидит там, как будто я возвратил "1s43040ji1001111a0101101111000"

1s43040ji1001111a0101101111000 - Should jump the user to slide 3.

Какой код статуса вы возвращаете?200 ОК

Любой другой статус, курс будет играть, но будет жаловаться, что не может подключиться к серверу.

@Эндрю

Есть ошибки, успехи, запросы в процессе? Нет ошибок Похоже, все успешно. нет запросов в процессе.

1 ответ

Решение

Я понял мою проблему. Мне не хватало Content-Length в заголовках. Content-Length - это длина данных ответа. Итак, я добавил это:

<cfheader name="Content-Length" value="#len('1s43040ji1001111a0101101111000')#">

К моему текущему коду, вот так:

<cfheader name="Access-Control-Allow-Header" value="Content-Type,Content-Length,Authorization,If-Match,If-None-Match,X-Experience-API-Version,X-Experience-API-Consistent-Through">
<cfheader name="Access-Control-Allow-Origin" value="*">
<cfheader name="Access-Control-Expose-Header" value="Last-Modified,Cache-Control,Content-Type,Content-Length,WWW-Authenticate,X-Experience-API-Version,X-Experience-API-Consistent-Through">
<cfheader name="Cache-Control" value="no-cache">
<cfheader name="Connection" value="keep-alive">
<cfheader name="Content-Type" value="application/json">
<cfheader name="X-Experience-API-Version" value="1.0.0">
<cfheader name="access-control-allow-methods" value="HEAD,GET,POST,PUT,DELETE">
<cfheader name="Content-Length" value="#len('1s43040ji1001111a0101101111000')#">
<cfreturn '1s43040ji1001111a0101101111000'>
Другие вопросы по тегам