Javascript 通过IFrame查询ODATA端点时接收Windows安全对话框

Javascript 通过IFrame查询ODATA端点时接收Windows安全对话框,javascript,odata,dynamics-crm-2011,Javascript,Odata,Dynamics Crm 2011,我使用的是IFD CRM2011环境,下面我将查询ODATA端点以填充IFrame中的下拉菜单 以下是填充下拉列表的代码: 函数GetQuestionSetList(){ var query='/Mhc_questionsetverSet?'+ “$select=Mhc_name,Mhc_questionsetverId&$filter=statecode/Value eq 0”; SDK.RestEndpointPaging .RetrieveRecords(查询、处理返回的问题集版本); }

我使用的是IFD CRM2011环境,下面我将查询ODATA端点以填充IFrame中的下拉菜单

以下是填充下拉列表的代码:

函数GetQuestionSetList(){ var query='/Mhc_questionsetverSet?'+ “$select=Mhc_name,Mhc_questionsetverId&$filter=statecode/Value eq 0”; SDK.RestEndpointPaging .RetrieveRecords(查询、处理返回的问题集版本); } 函数ProcessReturnedQuestionSetVersions(retrievedQuestionSets){ 对于(变量i=0;i
SDK.RestEndpointPaging.RetrieverRecords(查询,ProcessReturnedQuestionSetVersions)之后行执行此对话框提示我:

此时,我可以输入我的凭据,也可以按“取消”,然后填充下拉列表。在开发人员工具中,我注意到这两种情况下的错误:

SCRIPT5022:引发异常但未捕获

mhc_json2.js,第484行,字符13

//如果文本不可JSON解析,则会抛出一个语法错误。
抛出新的SyntaxError('JSON.parse')//第484行
};
}
}());

我不明白为什么会出现此对话框,或者为什么会抛出此错误。

发布此消息后,我碰巧检查了fiddler并发现了问题。在我的情况下,有两个调用
RetrieveRecords
。第一个调用返回状态200(成功),但第二个调用返回401

以下是两个电话:

https://alpha.ftg.com:5556//xrmservices/2011/organizationdata.svc/Mhc_questionsetverSet?$select=Mhc\U名称、Mhc\U问题集验证和$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”

在第二个调用中,服务器+odata端点连接两次。如果找到
\u next
参数,则
RetrieveRecordsCallback
函数应该剥离服务器和端点url,如下所示:

MSDN说明:

如果找到一个uu next属性,则将带有$skiptoken的新URL作为新的筛选参数值传递回SDK.RestEndpointPaging.RetrieverRecords,以便对每组记录重复该过程,直到检索到请求记录的总数>个数,并且不再返回u next属性

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";
    },
GetODataPath:函数(){
/// 
///用于检索到REST端点的路径的实用程序函数。
/// 
var serverUrl=Xrm.Page.context.getServerUrl();
//删除额外的“/”字符(如果存在)
if(serverUrl.match(/\/$/)){
serverUrl=serverUrl.substring(0,serverUrl.length-1);
}
返回serverUrl+“/xrmservices/2011/organizationdata.svc”;
},
 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";
    },