TinCan/xAPI - 恢复提示不工作

TinCan/xAPI - Resume Prompt Not Working

我在 ColdFusion 中构建了自己的简单 LMS。它只是使用一个 iframe 来显示课程,并且有一个页面记录了锡罐报表。它工作完美,但我有一个在 Studio '13/presenter '13 中设计的课程,输出是锡罐,简历功能在我的 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=

简历无效,但锡罐声明 post 到我的网站正确。

如果我使用 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=

简历确实有用,但 tincan 语句不行 post。

我已经按照教程设置了简历功能: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 上尝试了该课程。

恢复功能不起作用。

我已经尝试了所有不同选项、提示等的课程,flash cookies 启用和禁用。

恢复功能不起作用。

我试过 Scorm Cloud 上的课程。恢复功能有效! 我在我的计算机上用 FireFox 打开了 presentation.html。恢复功能有效。

我已将问题缩小到 TinCan。如果我通过更改

在 presentation.html 文件中关闭 TinCan
var g_bTinCan = true; to var g_bTinCan = false;

课程如期恢复。但是由于 TinCan 已关闭,它不会 post 向我的 LMS 发送任何语句。

我发现我可能需要用 state/resume 数据响应 POST state?method=GET。所以像这样

1Nk30a010904050607080b0on1001811f016110171101811000(告诉课程转到幻灯片 4 或类似内容)。

我了解数据是 encoded/compressed。数据实际上来自 posted 到 LMS 的状态数据。每张幻灯片 post 都是一个恢复点。我猜我只需要在用户恢复课程并且 tincan 请求恢复数据时从之前的 session 和 post 中获取恢复点数据。

但是因为某些原因,不管我return 和我如何return 了。我的课程只是坐在那里加载。一切都在那里,导航栏、课程附加内容、退出按钮,只是内容有加载标志。什么都不可点击。

我试过 post回拨类似于 scorm cloud 在 ColdFusion 中使用的 headers:

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

我试过 return 格式 json,纯文本,数组。但是课程没有加载。如果我刷新然后立即停止浏览器,我还发现了奇怪的行为(课程从不刷新)。它将弹出恢复提示,然后我可以单击 Yes/No。它有效。显然这是不对的。

有什么想法吗?我错过了什么?当我的(或任何)LMS/LRS 要求关于 state?method=GET.

的恢复点时,我正在寻找 Articulate 课程期望的回应

编辑

@Brian: content-type 是 application/json

LRS 应该 returning 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'>

问题是如果使用函数 returnFormat=json 或序列化 JSON() 告诉 CF 将 return 作为 json。它向 returned 数据添加内容。

以上代码将return:

1s43040ji1001111a0101101111000

告诉 CF 使用 json:

//"1s43040ji1001111a0101101111000"

这是 CF 的安全功能。

但让我感到困惑的是 Scorm Cloud 只是 returns

1s43040ji1001111a0101101111000

它的格式与 JSON 不同。它看起来像是纯文本,即使 Content-Type 是 application/json.

如果我 return 所有的 cfheader 信息但留下 cfreturn 空白 cfreturn "" 课程就在那里,就好像我 returned "1s43040ji1001111a0101101111000"

1s43040ji1001111a0101101111000 - Should jump the user to slide 3.

你 return 是什么状态码? 200 行

任何其他状态,课程会播放但会提示无法连接到服务器。

@安德鲁

Any errors, successes, requests in progress? No errors. Seems like everything is successful. no requests in progress.

我想通了我的问题。我在 headers 中遗漏了 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'>