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

时间:2012-01-05 21:43:26

标签: javascript odata dynamics-crm-2011

我正在使用IFD CRM2011环境,我正在关注this MSDN example查询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 个答案:

答案 0 :(得分:2)

发布后,我碰巧检查了fiddler并发现了问题。在我的情况下,有两次拨打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 /值%20当量%200安培; $选择= Mhc_name,Mhc_questionsetverId&安培; $ skiptoken = 1, 'mhc_questionsetverid', '%7B3F737386-54DF-DE11-A55C-00155D020C0D%7D','%7B7AF1B564-C3BF-DD11-8209-000BCDC54FC9 %7D'

在第二次调用中,服务器+ odata端点连接两次。如果找到RetrieveRecordsCallback参数,__next函数应该剥离服务器和端点URL:

  

MSDN说明:

     

如果找到__next属性,则将带有$ skiptoken的新URL作为新的过滤器参数值传递回SDK.RestEndpointPaging.RetrieveRecords,以便为每组记录重复该过程,直到请求的总数为&gt;检索记录并且不再返回__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()在网址的服务器端点和端点部分之间追加/,但是当返回新的过滤器参数时,额外的/已被剥离,因此{{ 1}}函数无法替换路径,第二次附加它。

修复很简单。只需将.replace功能更改为:

SDK.RestEndpointPaging.GetODataPath()