通过Rally Rest.net api查询工作区中的用户时失败

通过Rally Rest.net api查询工作区中的用户时失败,.net,rest,rally,.net,Rest,Rally,当我试图在rally rest.net api中查询用户列表时,遇到了KeyNotFound异常。示例代码如下所示: Request query = new Request("User"); query.Workspace = workspaceRef; var response = api.Query(query); 异常的详细信息是:“字典中不存在给定的键。”及其堆栈跟踪: at System.Collections.Generic.Dictionary`2.get_Item(TKey

当我试图在rally rest.net api中查询用户列表时,遇到了KeyNotFound异常。示例代码如下所示:

Request query = new Request("User");
query.Workspace = workspaceRef;

var response = api.Query(query);
异常的详细信息是:“字典中不存在给定的键。”及其堆栈跟踪:

at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at Rally.RestApi.DynamicJsonObject.GetMember(String name)
at Rally.RestApi.RallyRestApi.Query(Request request)
请告诉我查询工作区用户列表的正确方法

顺便问一下,有没有办法获得一个拥有访问Rally Rest.NETAPI项目权限的用户列表


非常感谢你的帮助

您的语法看起来正常。您在哪里看到“…密钥不存在…”错误发生?当访问结果集合时

我在下面提供了一个代码示例,它演示了在订阅中查询用户并总结他们的工作区和项目权限。我希望这有帮助

        // Query for User
        Request userRequest = new Request("user");
        userRequest.Fetch = new List<string>()
            {
                "UserName",
                "Subscription",
                "DisplayName",
                "UserPermissions"
            };

        userRequest.Query = new Query("");
        QueryResult queryUserResults = restApi.Query(userRequest);

        String userName;
        String displayName;            
        String mySubscriptionRef;
        String mySubscriptionName;

        // Fetch strings to pull in Subscription and UserPermission metadata
        string[] subscriptionFetch = { "Name", "SubscriptionID", "CreationDate" };
        string[] userPermissionFetch = { "Name", "Role", "Workspace", "Project" };
        string[] workspaceFetch = {"Name", "Description"};

        foreach (var result in queryUserResults.Results)
        {
            userName = result["UserName"];
            displayName = result["DisplayName"];
            var mySubscription = result["Subscription"];
            mySubscriptionRef = mySubscription["_ref"];

            // Query by Workspace Ref.
            var mySubscriptionFetched = restApi.GetByReference(mySubscriptionRef, subscriptionFetch);
            mySubscriptionName = mySubscriptionFetched["Name"];

            Console.WriteLine("Username: " + userName);
            Console.WriteLine("Display Name: " + displayName);
            Console.WriteLine("Subscription: " + mySubscriptionName);

            var myUserPermissions = result["UserPermissions"];

            // Loop through UserPermissions Collection
            foreach (var thisPermission in myUserPermissions)
            {
                // Grab UserPermission ref
                var myUserPermissionRef = thisPermission["_ref"];
                // Query from UserPermission ref
                var myUserPermissionFetched = restApi.GetByReference(myUserPermissionRef, userPermissionFetch);
                // Output project name
                Console.WriteLine("         Role: " + myUserPermissionFetched["Role"]);

                // Try Workspace ref
                try
                {

                    var myWorkspace = myUserPermissionFetched["Workspace"];
                    var myWorkspaceRef = myWorkspace["_ref"];

                    // Query from Workspace ref
                    var myWorkspaceFetched = restApi.GetByReference(myWorkspaceRef, workspaceFetch);

                    // Output Workspace data
                    Console.WriteLine("         Workspace Name:" + myWorkspaceFetched["Name"]);

                }
                catch (KeyNotFoundException knfe)
                {
                    Console.WriteLine("Key not found: " + "Workspace");
                }

                // Try Project ref
                try
                {

                    var myProject = myUserPermissionFetched["Project"];
                    var myProjectRef = myProject["_ref"];

                    // Query from Workspace ref
                    var myProjectFetched = restApi.GetByReference(myProjectRef, workspaceFetch);

                    // Output Project data
                    Console.WriteLine("         Project Name:" + myProjectFetched["Name"]);
                }
                catch (KeyNotFoundException knfe)
                {
                    Console.WriteLine("Key not found: " + "Workspace");
                }
//用户查询
请求用户请求=新请求(“用户”);
userRequest.Fetch=新列表()
{
“用户名”,
“订阅”,
“显示名称”,
“用户权限”
};
userRequest.Query=新查询(“”);
QueryResult queryUserResults=restApi.Query(userRequest);
字符串用户名;
字符串显示名;
字符串mySubscriptionRef;
字符串mySubscriptionName;
//获取字符串以拉入订阅和用户权限元数据
字符串[]subscriptionFetch={“Name”,“SubscriptionID”,“CreationDate”};
字符串[]userPermissionFetch={“名称”、“角色”、“工作区”、“项目”};
字符串[]workspaceFetch={“名称”,“描述”};
foreach(queryUserResults.Results中的var结果)
{
用户名=结果[“用户名”];
displayName=结果[“displayName”];
var mySubscription=result[“Subscription”];
mySubscriptionRef=mySubscription[“_ref”];
//按工作区引用进行查询。
var mySubscriptionFetched=restApi.GetByReference(mySubscriptionRef,subscriptionFetch);
mySubscriptionName=mySubscriptionFetched[“Name”];
Console.WriteLine(“用户名:”+用户名);
Console.WriteLine(“显示名称:”+displayName);
Console.WriteLine(“订阅:+mySubscriptionName”);
var myUserPermissions=result[“UserPermissions”];
//循环访问UserPermissions集合
foreach(myUserPermissions中的var thisPermission)
{
//抓取用户权限引用
var myUserPermissionRef=此权限[“_ref”];
//来自UserPermission ref的查询
var myUserPermissionFetched=restApi.GetByReference(myUserPermissionRef,userPermissionFetch);
//输出项目名称
WriteLine(“角色:+myUserPermissionFetched[“角色]);
//尝试工作区参考
尝试
{
var myWorkspace=myUserPermissionFetched[“工作区”];
var myWorkspaceRef=myWorkspace[“_ref”];
//从工作区ref查询
var myWorkspaceFetched=restApi.GetByReference(myWorkspaceRef,workspaceFetch);
//输出工作区数据
Console.WriteLine(“工作区名称:+myWorkspaceFetched[“名称”]);
}
捕获(KeyNotFoundException knfe)
{
Console.WriteLine(“找不到键:+”工作区”);
}
//尝试项目参考
尝试
{
var myProject=myUserPermissionFetched[“项目”];
var myProjectRef=myProject[“_ref”];
//从工作区ref查询
var myProjectFetched=restApi.GetByReference(myProjectRef,workspaceFetch);
//输出项目数据
Console.WriteLine(“项目名称:+myProjectFetched[“名称”]);
}
捕获(KeyNotFoundException knfe)
{
Console.WriteLine(“找不到键:+”工作区”);
}

FYI检查用户权限时,try/catch块是必需的,因为默认情况下,在Rally WSAPI中,订阅管理员有空的UserPermissionsHanks@Mark,现在可以工作了。似乎需要为请求分配查询对象。此外,我们可以使用此权限[“\u type”]来确定哪种类型的权限(工作区或项目)处理。