Получение диалога безопасности Windows при запросе конечной точки ODATA через IFrame - PullRequest
3 голосов
/ 06 января 2012

Я использую среду IFD CRM2011 и следую этому примеру MSDN , чтобы запросить конечную точку ODATA для заполнения раскрывающегося меню внутри IFrame.

Вот код, который заполняет выпадающий список:

function GetQuestionSetList() {
    var query = '/Mhc_questionsetverSet?' +
      '$select=Mhc_name,Mhc_questionsetverId&$filter=statecode/Value eq 0';
    SDK.RestEndpointPaging
       .RetrieveRecords(query, ProcessReturnedQuestionSetVersions);
}

function ProcessReturnedQuestionSetVersions(retrievedQuestionSets) {
    for (var i = 0; i < retrievedQuestionSets.length; i++) {
        var questionSet = retrievedQuestionSets[i];
        var value = questionSet.Mhc_questionsetverId;
        var name = questionSet.Mhc_name;

        //add option to select list
        $('#selectQuestionSetVersion').append($('<option>')
                                      .attr('value', value)
                                      .text(name));
    }
}

После выполнения строки SDK.RestEndpointPaging.RetrieveRecords(query, ProcessReturnedQuestionSetVersions); мне выдается следующее диалоговое окно:

enter image description here

В этот момент я могу либо ввести свои учетные данные, либо нажать «Отмена», и раскрывающийся список заполняется. В инструментах разработчика я замечаю эту ошибку в обоих случаях:

SCRIPT5022: Исключение, выброшенное и не пойманное

mhc_json2.js, строка 484 символа 13

// If the text is not JSON parseable, then a SyntaxError is thrown.

            throw new SyntaxError('JSON.parse');  //line 484
        };
    }
}());

Я не могу понять, почему появляется это диалоговое окно или почему возникает эта ошибка.

1 Ответ

2 голосов
/ 06 января 2012

После публикации я просто проверил скрипач и обнаружил проблему.В моей ситуации есть два звонка на RetrieveRecords.Первый вызов возвращает статус 200 (успех), а второй возвращает 401.

Вот два вызова:

https://alpha.ftg.com:5556//xrmservices/2011/organizationdata.svc/Mhc_questionsetverSet?$select=Mhc_name,Mhc_questionsetverId&$filter=statecode/Value eq 0

https://alpha.ftg.com:5556//xrmservices/2011/organizationdata.svchttps://alpha.ftg.com:5556/xrmservices/2011/organizationdata.svc/Mhc_questionsetverSet?$filter=statecode/Value%20eq%200&$select=Mhc_name,Mhc_questionsetverId&$skiptoken=1,'mhc_questionsetverid','%7B3F737386-54DF-DE11-A55C-00155D020C0D%7D','%7B7AF1B564-C3BF-DD11-8209-000BCDC54FC9%7D'

Во втором вызове конечная точка сервера + оддаты объединяется дважды.Предполагается, что функция RetrieveRecordsCallback удаляет URL-адрес сервера и конечной точки, если параметр __next найден, как показано здесь:

Объяснение MSDN:

Если свойство __next найдено, новый URL с $ skiptoken передается обратно в SDK.RestEndpointPaging.RetrieveRecords в качестве значения нового параметра фильтра, так что процесс повторяется для каждого набора записей до тех пор, пока не будет получено общее количество запрошенных записейсвойство __next больше не возвращается.

if (null != retrievedRecords.__next) {
    // The existance of the '__next' property 
    //indicates that more records are available
    // So the originating function is called again 
    //using the filter value returned
    var filter = retrievedRecords.__next
        .replace(SDK.RestEndpointPaging.GetODataPath(), "");
   SDK.RestEndpointPaging.RetrieveRecords(filter, callback);
}

SDK.RestEndpointPaging.GetODataPath() добавляет дополнительный / между серверной и конечной точками URL, но когда возвращается новый параметр фильтра, этодополнительный / был удален, поэтому функция .replace не может заменить путь и добавляется второй раз.

Исправление было тривиальным.Просто измените функцию SDK.RestEndpointPaging.GetODataPath() на это:

 GetODataPath: function () {
        /// <summary>
        /// Utility function to retrieve the path to the REST endpoint.
        /// </summary>
        var serverUrl = Xrm.Page.context.getServerUrl();

        //remove the extra '/' char if it exists
        if (serverUrl.match(/\/$/)) {
            serverUrl = serverUrl.substring(0, serverUrl.length - 1);
        }

        return serverUrl + "/xrmservices/2011/organizationdata.svc";
    },
...