Javascript 通过IFrame查询ODATA端点时接收Windows安全对话框
我使用的是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;iJavascript 通过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(查询、处理返回的问题集版本); }
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";
},