Невозможно подключиться к LRS с помощью библиотеки.NET Tin Can
Я пытаюсь использовать библиотеку.NET TinCan для использования в моей собственной системе управления обучением. Я включил пакет TinCan 0.0.2 Nuget в свое приложение и загрузил тестовый курс GolfExample_TCAPI. При локальном тестировании курс GolfExample загружается по следующему URL-адресу:
https://127.0.0.1/TINCAN/MYCOMPANY/GolfExample_TCAPI%20(1)/index.html?
При просмотре документации по запуску, которую я смог найти, кажется, что как минимум вы должны передать конечную точку, аутентификацию и актера, поэтому я попытался сделать это, используя dll, как показано ниже в моей модели представления.
var lrs = new RemoteLRS("https://cloud.scorm.com/tc/public/", "<username>", "<password>");
var actor = new TinCan.Agent();
actor.name = "John Paul Mc Feely";
actor.mbox = "jpmcfeely@hsl-data.com";
TINCANStartPage = HttpContext.Current.Request.Url.Scheme + "://" + @HttpContext.Current.Request.Url.Host + ":" +
@HttpContext.Current.Request.Url.Port + HttpContext.Current.Request.ApplicationPath + this.Course.BlobURL + "/index.html" + "?endpoint=" + lrs.endpoint + "&auth=" + lrs.auth + "&actor=" + actor.ToJSON();
При отладке я вижу, что это создало URL для окна запуска следующим образом:
"https://127.0.0.1/TINCAN/MYCOMPANY/GolfExample_TCAPI (1)/index.html?endpoint=https://cloud.scorm.com/tc/public/&auth=Basic anBtY2ZlZWx5QGhzbC1kYXRhLmNvbTpwbGFzbWExMQ==&actor={\"objectType\":\"Agent\",\"name\":\"John Paul Mc Feely\",\"mbox\":\"jpmcfeely@hsl-data.com\"}"
Это выглядит как правильный формат в соответствии с документацией, которую я вижу, но когда я продолжаю, окно запускается с URL как:
https://127.0.0.1/TINCAN/MYCOMPANY/GolfExample_TCAPI%20(1)/index.html?endpoint=https://cloud.scorm.com/tc/public/&auth=Basic%20anBtY2ZlZWx5QGhzbC1kYXRhLmNvbTpwbGFzbWExMQ==&actor={"objectType":"Agent","name":"John%20Paul%20Mc%20Feely","mbox":"jpmcfeely@hsl-data.com"}
Затем я получаю предупреждающее сообщение следующим образом:
[предупреждение] При подключении к хранилищу учебных материалов возникла проблема. (400 | Заявление 3bd49829-dc0b-4daa-a689-71a84c44e6ad не имеет назначенного актера.)
Если бы кто-нибудь мог увидеть, что я делаю не так, я был бы очень признателен.
2 ответа
Минимально параметры строки запроса должны быть URLEncoded. Вы должны были бы обернуть lrs.endpoint
, lrs.auth
а также actor.ToJSON()
в HttpUtility.UrlEncode()
,
using System.Web;
TINCANStartPage = HttpContext.Current.Request.Url.Scheme +
"://" +
@HttpContext.Current.Request.Url.Host +
":" +
@HttpContext.Current.Request.Url.Port +
HttpContext.Current.Request.ApplicationPath +
this.Course.BlobURL +
"/index.html" +
"?endpoint=" +
HttpUtility.UrlEncode(lrs.endpoint) +
"&auth=" +
HttpUtility.UrlEncode(lrs.auth) +
"&actor=" +
HttpUtility.UrlEncode(actor.ToJSON());
На основании предупреждающего сообщения кажется, что вы передаете это в TinCanJS. Нам нужно увидеть этот код для дальнейшего устранения неполадок. Код, который создает экземпляр TinCan
объект должен передать его url
для анализа, который, кажется, работает, но субъект не найден, возможно, из-за неправильной кодировки URL.
Обратите внимание, что тот факт, что вы получаете статус 400 с этим ответом, означает, что он успешно подключается к LRS, то, что отправлено в запросе, недействительно.
Я получил эту работу, сделав следующее на ViewModel:
//Initialize the LRS
var lrs = new RemoteLRS("https://cloud.scorm.com/tc/public/", "<username>", "<password>");
//Initialize the TinCan Actor for Launch String
this.Actor = new TinCan.Agent();
this.Actor.name = this.User.Forename + " " + this.User.Surname;
this.Actor.mbox = this.User.Email;
//Construct the TinCanStartPage
TINCANStartPage = HttpContext.Current.Request.Url.Scheme + "://" + @HttpContext.Current.Request.Url.Host + ":" +
@HttpContext.Current.Request.Url.Port + HttpContext.Current.Request.ApplicationPath + this.Course.BlobURL + this.LaunchPage;
Затем в представлении, откуда открывается окно TinCan, у меня есть следующее:
$(document).ready(function () {
var myActor = '@Html.Raw(Model.Actor.ToJSON())';
var launchLink = '@Model.TINCANStartPage' + '?endpoint=' + '@Model.LRS.endpoint' + '&auth=' + '@Model.LRS.auth' + '&actor=' + myActor;
window.open(launchLink, "SCORM", "width=1140,height=760,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=0,top=0");
});
function relaunch() {
var relaunchLink = '@Model.TINCANStartPage' + '?endpoint=' + '@Model.LRS.endpoint' + '&auth=' + '@Model.LRS.auth' + '&actor=' + myActor;
window.open(relaunchLink, 'SCORM', 'width=1140,height=760,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=0,top=0');
}