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

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

Если я использую презентацию.html, пример

https://www.domainname.com/folder/courses/example_course/presentation.html?&actor={"name":["My_Name"],"mbox":["mailto:[email protected]"],"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=

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

Если я использую презентацию_html5.html, пример

https://www.domainname.com/folder/courses/example_course/presentation_html5.html?&actor={"name":["My_Name"],"mbox":["mailto:[email protected]"],"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=

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

Я выполнил руководство и настроил функцию возобновления: ="nofollow">http://www.Article.com/support/presenter-09/enable-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 state?method=GET с данными состояния/резюме. Итак, что-то вроде этого

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

Я понимаю, что данные закодированы/сжаты. Данные фактически поступают из данных о состоянии, отправленных в LMS. Каждый слайд публикует точку возобновления. Я предполагаю, что мне просто нужно получить данные точки возобновления из предыдущего сеанса и отправить обратно, когда пользователь возобновит курс, а 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, когда он запрашивает точку возобновления на state?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 OK

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

@Андрей

Любые ошибки, успехи, запросы в процессе? Нет ошибок. Вроде все успешно. запросы не выполняются.


person LMS    schedule 21.01.2015    source источник
comment
Имеет ли исходный опубликованный контент тип контента application/json или что-то еще? LRS должен возвращать Content-Type в том виде, в каком он был получен в исходном запросе. Также обратите внимание, что он должен иметь заголовок Etag (хотя, скорее всего, это не ваша проблема). Какой код состояния вы возвращаете? Тот факт, что он работает в SCORM Cloud, предполагает, что это неправильное поведение LRS.   -  person Brian J. Miller    schedule 22.01.2015
comment
Если вы откроете инструменты разработчика в Chrome и посмотрите на консоль и сеть, увидите ли вы какие-либо ошибки, успехи, запросы в процессе? (Вам нужно обновить после открытия инструментов разработчика, чтобы заполнить сеть). т.е. попадают ли данные в Storyline в первую очередь?   -  person Andrew Downes    schedule 22.01.2015
comment
Кроме того, не могли бы вы дать нам ссылку, где мы можем увидеть возникновение проблемы?   -  person Andrew Downes    schedule 22.01.2015
comment
Я обновил свой пост с ответами на все вопросы. Спасибо за вашу помощь в этом.   -  person LMS    schedule 22.01.2015


Ответы (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'>
person LMS    schedule 28.01.2015