Невозможно подключиться к 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/&amp;auth=Basic%20anBtY2ZlZWx5QGhzbC1kYXRhLmNvbTpwbGFzbWExMQ==&amp;actor={&quot;objectType&quot;:&quot;Agent&quot;,&quot;name&quot;:&quot;John%20Paul%20Mc%20Feely&quot;,&quot;mbox&quot;:&quot;jpmcfeely@hsl-data.com&quot;}

Затем я получаю предупреждающее сообщение следующим образом:

[предупреждение] При подключении к хранилищу учебных материалов возникла проблема. (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');
} 
Другие вопросы по тегам