【问题标题】:Error 'Value cannot be null:nodeName' when creating new iteration创建新迭代时出现错误“值不能为空:nodeName”
【发布时间】:2020-12-30 01:00:26
【问题描述】:

我在尝试使用客户端 SDK 创建新迭代时遇到错误:

值不能为空。 参数名称:节点名

作为测试,我尝试使用 Postman 和 REST API(按照 here 的建议)创建它,并且成功了。

我已经成功地使用了很长一段时间来消除我今年的 sprint 层次结构。这是第一次出现这种错误——过去一年的运行顺利进行。自去年成功运行以来,我没有改变任何东西(据我所知)。

正如我们所见,迭代的Name 属性设置正确。我尝试了Overloads 而不是Shadows,但这没有帮助。

如何解决此问题以了解 nodeName 是什么以及如何使用客户端 SDK 填充它?

这是我的代码:

Module Main()
  Private Sub AddYear(Year As Integer, Client As WorkItemTrackingHttpClient)
    Dim oIterationYear As Classifications.Iteration
    Dim dFinishDate As Date
    Dim dStartDate As Date

    Console.WriteLine($"Year:{vbTab}{vbTab}{Year}")

    dFinishDate = New Date(Year, 12, 31)
    dStartDate = New Date(Year, 1, 1)

    oIterationYear = New Classifications.Iteration(Client, TeamProject, Year, dStartDate, dFinishDate)
    oIterationYear.Save()

    ...

  End Sub
End Module

Public Class Iteration
  Inherits Base

  Public Sub New(Client As WorkItemTrackingHttpClient, TeamProject As TeamProjects, Name As String, StartDate As Date, FinishDate As Date)
    Me.New(Client, TeamProject, Name, StartDate, FinishDate, Nothing)
  End Sub

  Public Sub New(Client As WorkItemTrackingHttpClient, TeamProject As TeamProjects, Name As String, StartDate As Date, FinishDate As Date, Parent As Iteration)
    MyBase.New(Client, TeamProject, Parent)

    Me.StructureType = TreeNodeStructureType.Iteration
    Me.FinishDate = FinishDate
    Me.StartDate = StartDate
    Me.Name = Name
  End Sub

  ...

End Class

Public MustInherit Class Base
  Inherits WorkItemClassificationNode

  Public Sub New(Client As WorkItemTrackingHttpClient, TeamProject As TeamProjects, Parent As Base)
    Me.ProjectName = TeamProject.ToDescription
    Me.Parent = Parent
    Me.Client = Client
  End Sub

  Public Sub Save()
    If Me.Parent.IsNothing Then
      Me.Node = Me.Client.CreateOrUpdateClassificationNodeAsync(Me, Me.ProjectName, Me.StructureType).Result <-- Error
    Else
      Me.Node = Me.Client.CreateOrUpdateClassificationNodeAsync(Me, Me.ProjectName, Me.StructureType, path:=Me.Path).Result
    End If
  End Sub

  ...

  Public Shadows Property Name As String
    Get
      If Me.Node.IsNothing Then
        Name = Me._Name
      Else
        Name = Me.Node.Name
      End If
    End Get
    Set(Value As String)
      Me._Name = Value
    End Set
  End Property
  Private _Name As String
End Class

注意:这是一个与语言无关的问题,因此我故意省略了VB.NET 标签。答案可以来自 VB.NET 或 C#——我可以用任何一个。

-- 编辑--

根据在接受的答案中找到的设计建议,我想出了这个可行的解决方案:

Public MustInherit Class Base
  Public Sub New(Client As WorkItemTrackingHttpClient, TeamProject As TeamProjects, Parent As Base)
    Me.Node = New WorkItemClassificationNode With {
      .StructureType = StructureType,
      .Name = Name
    }

    Me.ProjectName = TeamProject.ToDescription
    Me.Parent = Parent
    Me.Client = Client
    Me.Name = Name
  End Sub

  Public Sub Save()
    If Me.Parent.IsNothing Then
      Me.Node = Me.Client.CreateOrUpdateClassificationNodeAsync(Me.Node, Me.ProjectName, Me.StructureType).Result
    Else
      Me.Node = Me.Client.CreateOrUpdateClassificationNodeAsync(Me.Node, Me.ProjectName, Me.StructureType, path:=Me.Path).Result
    End If
  End Sub

  ...

  Public Property Name As String
    Get
      Return Me.Node.Name
    End Get
    Private Set(Value As String)
      Me.Node.Name = Value
    End Set
  End Property
End Class

基本上我所做的只是从WorkItemClassificationNode 中删除基类的继承,并在所有情况下在内部存储节点引用。我还简化了Name 属性的实现。

至于为什么它突然停止工作而我的代码没有任何变化,我唯一能想到的是编译器发生变化影响SDK评估ShadowsOverloads的方式的可能性很小关键词。我知道这是一个很长的机会,但否则我会完全不知所措。

底线,它现在可以工作了。

【问题讨论】:

    标签: api sdk client azure-devops-server-2019


    【解决方案1】:

    我可以在 Azure DevOps Services .NET SDK 中使用 Microsoft.TeamFoundation.WorkItemTracking.WebApi 创建新的迭代。

    请查看以下示例:

     class Program
        {
            static void Main(string[] args)
            {
               
                Uri accountUri = new Uri("https://dev.azure.com/org/");
                string personalAccessToken = "pat";
               
                VssConnection _connection = new VssConnection(accountUri, new VssBasicCredential(string.Empty, personalAccessToken));
                WorkItemTrackingHttpClient workItemTrackingHttpClient = _connection.GetClient<WorkItemTrackingHttpClient>();
    
                Iteration iteration = new Iteration(workItemTrackingHttpClient,2021, "projectName");
                iteration.SaveNode();
            }
              
        }
    
    public class Iteration
        {
            WorkItemTrackingHttpClient client;
            WorkItemClassificationNode node;
            string project;
            string path;
            public Iteration(WorkItemTrackingHttpClient client, int Year, string project, string path=null) {
                this.client = client;
                node = new WorkItemClassificationNode();
                this.project = project;
                this.path = path;
                IDictionary<string, object> DateAttr = new Dictionary<string, object>();
                DateAttr.Add("startDate", new DateTime(Year, 1, 1));
                DateAttr.Add("finishDate", new DateTime(Year, 12, 31));
                node.Attributes = DateAttr;
                node.Name = Year.ToString();
                node.StructureType = TreeNodeStructureType.Iteration;
    
            }
    
            public void SaveNode()
            {
                var res = client.CreateOrUpdateClassificationNodeAsync(node, project, TreeStructureGroup.Iterations, path).Result;
                Console.WriteLine(res.Id);
            }
        }
    

    查看以下结果:

    我可以重现上述错误Value cannot be null. Parameter name: nodeName。如果我故意没有设置node.Name = null;您可以调试代码以检查未设置节点名称的原因。

    【讨论】:

    • 谢谢。我今天不在办公桌前,所以明天我会试一试,让你知道。
    • @InteXX 你有机会看看上面的例子吗?进展如何?
    • 感谢您的入住 - 它在明天(星期二)的清单上。
    • 您的代码有效。我的没有。这很奇怪,因为我们可以看到我在 Iteration 类构造函数中设置了 Name 属性。从概念上讲,您的代码和我的代码之间的唯一区别是您的代码在 SaveNode() 方法中实例化了一个新的 WorkItemClassificationNode 对象。我的基类直接继承WorkItemClassificationNode。这个结构至少已经为我服务了四年——这个新的失败非常突然和出乎意料。显然有些东西发生了变化,我只是不知道是什么——除了那不是我的代码。
    • 如果我采用您的概念,我将不得不从整个应用程序中抽出胆量——而且其中有大量代码。我难住了。有没有办法检查发送到 API 的 JSON?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2015-08-26
    • 2021-06-14
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多