【问题标题】:TinCan/xAPI - Resume Prompt Not WorkingTinCan/xAPI - 恢复提示不起作用
【发布时间】:2015-03-20 10:48:19
【问题描述】:

我在 ColdFusion 中构建了自己的简单 LMS。它只是使用 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=

简历确实有效,但 tincan 声明没有发布。

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

恢复功能不起作用。

我已经尝试过 Scorm Cloud 上的课程。恢复功能有效! 我在我的电脑上用 FireFox 打开了presentation.html。恢复功能有效。

我已将问题范围缩小到 TinCan。如果我通过更改在presentation.html 文件中关闭TinCan

var g_bTinCan = true; to var g_bTinCan = false;

课程继续正常进行。但由于 TinCan 已关闭,它不会向我的 LMS 发布任何语句。

我发现我可能需要使用状态/恢复数据来响应 POST state?method=GET。所以像这样的

1Nk30a010904050607080b0on1001811f016110171101811000(告诉课程转到幻灯片 4 或类似的东西)。

我了解数据已编码/压缩。数据实际上来自发布到 LMS 的状态数据。每张幻灯片都会发布一个简历点。我猜我只需要从上一个会话中获取恢复点数据并在用户恢复课程并且 tincan 要求恢复数据时发回。

但是出于某种原因,无论我返回什么以及如何返回它。我的课程只是坐在那里加载。一切都在那里,导航栏,课程附加内容,退出按钮,只是内容有加载标志。没有什么是可点击的。

我已尝试发回 scorm cloud 在 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 课程在请求 state?method=GET 的恢复点时期望从我的(或任何)LMS/LRS 得到什么响应。

编辑

@Brian: content-type 是 application/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 使用函数 returnFormat=json 或 serializeJSON() 以 json 形式返回。它将内容添加到返回的数据中。

上面的代码会返回:

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 确定

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

@安德鲁

任何错误、成功、请求正在进行中? 没有错误。好像一切都很顺利。没有正在进行的请求。

【问题讨论】:

  • 原始发布内容的内容类型是否为 application/json 或其他? LRS 应该返回在原始请求中收到的 Content-Type。另请注意,它应该有一个 Etag 标头(尽管这可能不是您的问题)。你返回什么状态码?它在 SCORM Cloud 中运行的事实确实表明它是 LRS 的不当行为。
  • 如果您在 Chrome 中打开开发人员工具并查看控制台和网络,您是否收到任何错误、成功和正在进行的请求? (您需要在打开开发人员工具后刷新才能填充网络)。 IE。数据是首先进入 Storyline 的吗?
  • 另外,你能给我们一个链接,我们可以看到发生的问题吗?
  • 我更新了我的帖子,回答了所有问题。感谢您对此的帮助。

标签: coldfusion scorm tin-can-api articulate-storyline


【解决方案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'>

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多