我有一个代码片段一直工作到上周末的某个时候。 这很简单,对于给定的项目名称,给我与其关联的团队成员。 查询本身可以工作并给我一个结果集,但是当我尝试迭代任何字典时,我得到了一个异常。
这是片段:
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 更新。
非常欢迎任何建议。
当使用最新的 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);
}
}