Rally REST API 损坏?

问题描述 投票:0回答:1

我有一个代码片段一直工作到上周末的某个时候。 这很简单,对于给定的项目名称,给我与其关联的团队成员。 查询本身可以工作并给我一个结果集,但是当我尝试迭代任何字典时,我得到了一个异常。

这是片段:

try
{
    Request projectRequest = new Request("project");
    projectRequest.Fetch = new List<string>()
                                {
                                    "Name",
                                    "Owner",
                                    "State",
                                    "Description",
                                    "Workspace",
                                    "TeamMembers",
                                    "Releases"};
    String projectName = rallyProject.Text;
    // get me results for the given project
    projectRequest.Query = new Query("Name", Query.Operator.Equals, projectName);
    QueryResult queryProjectResults = restApi.Query(projectRequest);
    DynamicJsonObject myProject = queryProjectResults.Results.First();
    
    myProjectReference = myProject["_ref"];

    var projectState = myProject["State"];
    var workspace = myProject["Workspace"];
    myWorkspaceRef = workspace["_ref"];
    string currentUser = userComboBox.Text;

    userComboBox.DataSource = null;
    userComboBox.Items.Clear();
    userComboBox.Sorted = false;
    
    // iterationComboBox.Items.Add("Unscheduled");
    userMap.Clear();
    List<string> userList = new List<string>();
    userList.Add("");

到目前为止一切正常,项目查询成功,我可以提取简单的字符串。 然而,下一个语句失败,第一个枚举抛出异常:

    foreach (var result in myProject["TeamMembers"])
    {
        userMap.Add(result["_refObjectName"], result["_ref"]);
        userList.Add(result["_refObjectName"]); 
    }
    userList.Sort();
 }
catch (Exception ex)
{
    myWorkspaceRef = null;
}
            

抛出的异常是:

无法将类型“Rally.RestApi.DynamicJsonObject”隐式转换为“System.Collections.IEnumerable”。存在显式转换(您是否缺少转换?)

如前所述,直到上周左右,这已经有效了几个月。机器上唯一改变的是正常的 Windows 更新。

非常欢迎任何建议。

c# .net rest web-services rally
1个回答
0
投票

当使用最新的 dll 来自 Rally REST .NET Toolkit 的存储库和 WS API v2.0 时,我可以复制相同的错误(我们鼓励用户这样做,因为今年 6 月之后将不再支持 WS API 1.43)按照此时间表)。

为了使您的代码与 WS API v2.0 兼容,我稍微修改了您的代码以进行单独的调用来获取 TeamMembers 集合的对象:

Request teamRequest = new Request(myProject["TeamMembers"]);
                QueryResult teamResult = restApi.Query(teamRequest);
                foreach (var teammate in teamResult.Results)
                {
                    userMap.Add(teammate["_refObjectName"], teammate["_ref"]);
                    userList.Add(teammate["_refObjectName"]);
                }

在 Rally Web Services API v2.0 中,出于性能原因,我们删除了在同一响应中返回子集合的功能。在 v2.0 中,获取集合将返回一个对象,其中包含计数和从中获取集合的 url。在旧版本的 WS API 中,某些获取列表会创建大量递归调用,并且获取中包含的所有集合使得调用相当昂贵。在 WS API v2.0 中,这种情况不会发生,因为必须进行单独的调用才能获取集合的对象。

如果您在针对 WS API 1.43 或更早版本运行代码时遇到此问题,请重试,因为昨天我们在 fetch 包含版本时遇到了影响 1.43 的临时问题。这个问题当天就解决了。

这里是适用于 WS API v2.0 的完整代码:

static void Main(string[] args)
            {
                RallyRestApi restApi;

                restApi = new RallyRestApi("[email protected]", "secret", "https://rally1.rallydev.com", "v2.0");
                String workspaceRef = "/workspace/12352608129";
                try
                {
                    Request projectRequest = new Request("project");
                    projectRequest.Fetch = new List<string>()
                                                {
                                                    "Name",
                                                    "Owner",
                                                    "State",
                                                    "Description",
                                                    "Workspace",
                                                    "TeamMembers",
                                                    "Releases"};
                    projectRequest.Workspace = workspaceRef;
                    String projectName = "Company X";

                    projectRequest.Query = new Query("Name", Query.Operator.Equals, projectName);
                    QueryResult queryProjectResults = restApi.Query(projectRequest);
                    DynamicJsonObject myProject = queryProjectResults.Results.First();

                    String myProjectReference = myProject["_ref"];

                    var projectState = myProject["State"];
                    List<string> userList = new List<string>();
                    userList.Add("");
                    Dictionary<string, string> userMap = new Dictionary<string, string>();

                    Request teamRequest = new Request(myProject["TeamMembers"]);
                    QueryResult teamResult = restApi.Query(teamRequest);
                    foreach (var teammate in teamResult.Results)
                    {
                        userMap.Add(teammate["_refObjectName"], teammate["_ref"]);
                        userList.Add(teammate["_refObjectName"]);
                    }
                    userList.Sort();
                    Console.WriteLine("Test user: " + userMap["nick01"]);

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);

                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.