我在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®istration=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®istration=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上尝试过几个不同网站的课程。
简历功能无效。
我已经尝试过所有不同的选项,提示等,闪存cookie启用和禁用。
简历功能无效。
我已经尝试过关于Scorm Cloud的课程。恢复功能有效! 我在FireFox上的计算机上打开了presentation.html。恢复功能有效。
我已将问题缩小到TinCan。如果我通过更改
在presentation.html文件中关闭TinCanvar g_bTinCan = true; to var g_bTinCan = false;
课程将按原样恢复。但是由于TinCan已关闭,它不会向我的LMS发布任何陈述。
我发现我可能需要用状态/恢复数据来响应POST状态?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课程期待作为我(或任何)LMS / LRS的响应,当它要求恢复状态的时候?方法= GET。
修改
@Brian:content-type是application / json
LRS应该按照收到的内容类型返回 这是它变得棘手的地方。 state?method = GET重定向到cfc函数。 ../包括/ LRSCFC.cfc方法= GETSTATE&安培; returnFormat =纯
这是功能:
<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或serializeJSON()告诉CF返回json。它会向返回的数据添加内容。
以上代码将返回:
1s43040ji1001111a0101101111000
告诉CF使用json:
//"1s43040ji1001111a0101101111000"
这是CF的安全功能。
但令我困惑的是Scorm Cloud刚刚返回
1s43040ji1001111a0101101111000
它的格式不像JSON。即使Content-Type是application / json,它看起来似乎是纯文本。
如果我返回所有的cfheader信息,但请将cfreturn留空cfreturn&#34;&#34;该课程就在那里,好像我回来了#34; 1s43040ji1001111a0101101111000&#34;
1s43040ji1001111a0101101111000 - Should jump the user to slide 3.
您要返回什么状态代码? 200 OK
任何其他状态,该课程将播放但会抱怨它无法连接到服务器。
@Andrew
任何错误,成功,正在进行的请求? 没有错误。似乎一切都很成功。没有正在进行的请求。
答案 0 :(得分: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'>