TFS 2015 API c# 工作项验证无法正常工作
TFS 2015 API c# Work item validation not working properly
我验证了一个工作项,我在其中将状态更改为允许的值。它仍然说价值是错误的。
设置值和函数调用:
internal void closeWI(int tfsWIID)
{
Log.logger.Info("Closing Item in TFS with ID: " + tfsWIID);
Dictionary<string, object> valuesToUpdate = new Dictionary<string, object>();
valuesToUpdate.Add("System.State", "Closed");
valuesToUpdate.Add("System.Reason", "Work done");
putWorkItem(valuesToUpdate, tfsWIID);
}
应用所有字段更改的通用函数:
private int putWorkItem(Dictionary<string, object> valuesToUpdate, int tfsID = 0)
{
using (var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(Config.tfsInnovationUri))
{
var wiStore = projectCollection.GetService<WorkItemStore>();
Project project = wiStore.Projects.GetById(currentTFSProjectID);
if (wiStore != null && wiStore.Projects != null)
{
WorkItem wi = tfsID != 0 ? wiStore.GetWorkItem(tfsID) : new WorkItem(project.WorkItemTypes["Verification Issue"]);
Log.logger.Info(tfsID != 0 ? "Updating TFS WI with ID: " + tfsID : "Creating new TFS WI");
foreach (KeyValuePair<string, object> field in valuesToUpdate)
wi.Fields[field.Key].Value = field.Value;
wi = validateData(wi);
wi.Save();
return wi.Id;
}
}
return 0;
}
验证:
public WorkItem validateData(WorkItem wi)
{
var valErrors = wi.Validate();
foreach (Field error in valErrors)
{
Log.logger.Error(wi.Id + " Error: " + error.Name + " val: <" + error.Value + "> allowed values are: ");
foreach (string allowedVal in error.AllowedValues)
Log.logger.Info(allowedVal);
}
return wi;
}
并且输出:
2017-07-19 17:51:11,469 [INFO] <closeWI> Closing Item in TFS with ID: 25694
2017-07-19 17:51:13,578 [ERROR] <validateData> 25694 Error: State val: <Closed> allowed values are:
2017-07-19 17:51:13,594 [INFO] <validateData> Active
2017-07-19 17:51:13,594 [INFO] <validateData> Closed
2017-07-19 17:51:13,594 [INFO] <validateData> Integrated
2017-07-19 17:51:13,594 [INFO] <validateData> Integration skipped
2017-07-19 17:51:13,594 [INFO] <validateData> Work Complete
2017-07-19 17:51:13,594 [ERROR] <validateData> 25694 Error: Reason val: <Work done> allowed values are:
2017-07-19 17:51:13,609 [INFO] <validateData> Cancelled
2017-07-19 17:51:13,609 [INFO] <validateData> Customer accepted
2017-07-19 17:51:13,609 [INFO] <validateData> Duplicate
2017-07-19 17:51:13,625 [INFO] <validateData> User Mistake
2017-07-19 17:51:13,625 [INFO] <validateData> Work done
[...]
所以如上所示,该值在允许值列表中,但它仍然验证错误。还有更多错误,例如未设置更改日期和更改者也不起作用,尽管有正确的用户。
当我更改 assignedTo 或 Description 等字段时,我可以确保它正常工作。它正在另一个项目中工作以改变状态。所以它与权限无关。
我没试过:
new WorkItemStore(_tfs, WorkItemStoreFlags.BypassRules);
因为它应该可以正常工作,但我会在几分钟后尝试这个。
有人知道吗?
要改变工作项状态,也需要绕过规则。看看这个问题:How to change workflow state of the newly created TFS work item through API?
正如您提到的解决方案,将 WorkItemStore
对象的 BypassRules
属性 设置为 true。为此,您必须按以下方式实例化工作项存储:
var workItemStore = new WorkItemStore(collection, WorkItemStoreFlags.BypassRules);
注意:您需要一些特殊的权限才能使用 BypassRules 标志.您的帐户需要属于 Project Collection Service Accounts 组(或 Team Foundation Service Accounts)。
如果您不知道如何操作,请按照本教程进行操作:How to add a user to Project Collection Service Account in TFS / VSO
我验证了一个工作项,我在其中将状态更改为允许的值。它仍然说价值是错误的。
设置值和函数调用:
internal void closeWI(int tfsWIID)
{
Log.logger.Info("Closing Item in TFS with ID: " + tfsWIID);
Dictionary<string, object> valuesToUpdate = new Dictionary<string, object>();
valuesToUpdate.Add("System.State", "Closed");
valuesToUpdate.Add("System.Reason", "Work done");
putWorkItem(valuesToUpdate, tfsWIID);
}
应用所有字段更改的通用函数:
private int putWorkItem(Dictionary<string, object> valuesToUpdate, int tfsID = 0)
{
using (var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(Config.tfsInnovationUri))
{
var wiStore = projectCollection.GetService<WorkItemStore>();
Project project = wiStore.Projects.GetById(currentTFSProjectID);
if (wiStore != null && wiStore.Projects != null)
{
WorkItem wi = tfsID != 0 ? wiStore.GetWorkItem(tfsID) : new WorkItem(project.WorkItemTypes["Verification Issue"]);
Log.logger.Info(tfsID != 0 ? "Updating TFS WI with ID: " + tfsID : "Creating new TFS WI");
foreach (KeyValuePair<string, object> field in valuesToUpdate)
wi.Fields[field.Key].Value = field.Value;
wi = validateData(wi);
wi.Save();
return wi.Id;
}
}
return 0;
}
验证:
public WorkItem validateData(WorkItem wi)
{
var valErrors = wi.Validate();
foreach (Field error in valErrors)
{
Log.logger.Error(wi.Id + " Error: " + error.Name + " val: <" + error.Value + "> allowed values are: ");
foreach (string allowedVal in error.AllowedValues)
Log.logger.Info(allowedVal);
}
return wi;
}
并且输出:
2017-07-19 17:51:11,469 [INFO] <closeWI> Closing Item in TFS with ID: 25694
2017-07-19 17:51:13,578 [ERROR] <validateData> 25694 Error: State val: <Closed> allowed values are:
2017-07-19 17:51:13,594 [INFO] <validateData> Active
2017-07-19 17:51:13,594 [INFO] <validateData> Closed
2017-07-19 17:51:13,594 [INFO] <validateData> Integrated
2017-07-19 17:51:13,594 [INFO] <validateData> Integration skipped
2017-07-19 17:51:13,594 [INFO] <validateData> Work Complete
2017-07-19 17:51:13,594 [ERROR] <validateData> 25694 Error: Reason val: <Work done> allowed values are:
2017-07-19 17:51:13,609 [INFO] <validateData> Cancelled
2017-07-19 17:51:13,609 [INFO] <validateData> Customer accepted
2017-07-19 17:51:13,609 [INFO] <validateData> Duplicate
2017-07-19 17:51:13,625 [INFO] <validateData> User Mistake
2017-07-19 17:51:13,625 [INFO] <validateData> Work done
[...]
所以如上所示,该值在允许值列表中,但它仍然验证错误。还有更多错误,例如未设置更改日期和更改者也不起作用,尽管有正确的用户。
当我更改 assignedTo 或 Description 等字段时,我可以确保它正常工作。它正在另一个项目中工作以改变状态。所以它与权限无关。
我没试过:
new WorkItemStore(_tfs, WorkItemStoreFlags.BypassRules);
因为它应该可以正常工作,但我会在几分钟后尝试这个。
有人知道吗?
要改变工作项状态,也需要绕过规则。看看这个问题:How to change workflow state of the newly created TFS work item through API?
正如您提到的解决方案,将 WorkItemStore
对象的 BypassRules
属性 设置为 true。为此,您必须按以下方式实例化工作项存储:
var workItemStore = new WorkItemStore(collection, WorkItemStoreFlags.BypassRules);
注意:您需要一些特殊的权限才能使用 BypassRules 标志.您的帐户需要属于 Project Collection Service Accounts 组(或 Team Foundation Service Accounts)。
如果您不知道如何操作,请按照本教程进行操作:How to add a user to Project Collection Service Account in TFS / VSO