AJAX ЗВОНОК
var payload = { "strUSERID": parent.objScormManager.getValue("cmi.core.student_id"), "strSESSIONID": parent.objScormManager.getValue("session_id"), "strSCORM_VARNAME": varname, "strSCORM_VARVALUE": varvalue, "strACCUMULATEDTIME": parent.objTimerManager.getTime().toString() };
try {
$.ajax({
type: "POST",
url: "/folder/XXXXXXXXX",
data: JSON.stringify({ SCORM: payload }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: OnSuccess_Try1,
error: OnError_Try1,
async: true
});
function OnError_Try1(xhr, status, error) {
//Some of our users are somehow ending up here in the ERROR function instead of the success function.
//The code below basically tries to check if XHR is undefined, and we are trying to get the ERROR message
//about why it failed
try
{
return_value = "false";
var strError = "";
try
{
var objReturnData = JSON.parse(xhr.responseText);
strError = objReturnData.Message;
} catch (Exception)
{
if (xhr.responseJSON.Message != null)
{
strError = xhr.responseJSON.Message;
}
else if (xhr.responseText != null)
{
strError = xhr.responseText;
}
else
{
strError = "XHR response is undefined";
}
}
strMessage = "Varname: " + varname + " Varvalue: " + varvalue + " Error Reason: " + strError;
parent.objErrorManager.throwError(strMessage, "579", false)
}
catch (objException)
{
//For some reason our users end up in this catch block because 'Unable to get property 'Message' of
//undefined or null reference'
return_value = "false";
var strMessage = objException.message;
if (strMessage == null) {
strMessage = "Generic Client Error SetValue";
}
strMessage = "Varname: " + varname + " Varvalue: " + varvalue + " " + strMessage;
parent.objErrorManager.throwError(strMessage, "580", false);
}
}
ВЕБ-МЕТОД
public string xxxxx(objScorm SCORM)
{
//Do stuff here.
}
public class objScorm
{
public string strUSERID { get; set; }
public string strSESSIONID { get; set; }
public string strSCORM_VARNAME { get; set; }
public string strSCORM_VARVALUE { get; set; }
public string strMASTERY_SCORE { get; set; }
public string strACCUMULATEDTIME { get; set; }
public string strLEARNINGOBJECTID { get; set; }
public string strCOMPLETED { get; set; }
public string strMASTERYSCORE { get; set; }
}
Практически все наши тесты, которые мы провели, даже на нашем действующем сайте, AJAX всегда корректно подключается к веб-методу, и у нас нет проблем, и иногда мы вызываем ошибку, и когда мы ДЕЙСТВИТЕЛЬНО вызываем ошибку, вызывается функция OnError_Try1, и мы можем четко видеть ошибку, которую веб-метод возвращает с помощью XHR.responseText.
ИНОГДА наши пользователи выдают ошибки, и xhr.responseText полностью равен нулю, поэтому его синтаксический анализ завершается неудачно, и аналогично xhr.response JSON полностью равен нулю / неопределенному, что приводит к его сбою.
Это скрывает настоящую причину сбоя веб-метода, и мы даже не знаем, как пользователи попадают в блок OnError_Try, потому что мы не можем его воспроизвести.
Потому что 99 из 100 вызовов идеальны, но по какой-то причине 1 вызов не будет работать, и это не похоже на то, что мы даже передаем странные данные ... Обычно это просто простые строки.
Вот несколько примеров ошибок, которые мы получаем из блока CATCH, ПОТОМУ ЧТО xhr не определено, и даже попытка проверки кажется неудачной:
1) Имя переменной: cmi.core.score.min Значение переменной: 0 Невозможно получить свойство «Сообщение» неопределенной или нулевой ссылки
2) Имя переменной: cmi.core.session_time Значение переменной: 0006: 12: 18.96 undefined не является объектом (оценка 'xhr.response JSON .Message')
* 1 026 * 3) Varname: cmi.core.exit Varvalue: suspend undefined не является объектом (оценка 'xhr.response JSON .Message')
TL; DR: Они попадают в блок catch в нижней части функции OnError_Try1, потому что мы пытаемся проанализировать / получить доступ к данным XHR, которые НЕ возвращаются !!! Что дает?