1

在解析 MSTest 结果 (.TRX) 文件时发现了这个问题:我们有一些将字符输出到标准输出的单元测试。MSTest 将此输出存储<stdout>在 TRX 文件中的节点中。在这个 TRX 文件上调用 XDocument.Load() 应该抛出,因为这些字符对于 XML 文档是无效的。相反,这会触发 TFS 构建代理崩溃。

使用默认 TFS 2012 工作流“DefaultTemplate.11.1.xaml”,在“TryToCompiletheProject”部分,添加对执行此操作的代码活动的调用:

protected override void Execute(CodeActivityContext context)
{
    string xmlText = @"<stdout>... &#x1D; ...</stdout>";
    XDocument doc = XDocument.Parse(xmlText);
}

在这个工作流的这个区域中,有一个 try/catch 应该捕获异常、记录异常消息并停止构建。相反,这会使 TFS 构建代理崩溃。

在 Windows 事件日志中注意到:

The build machine will be stopped because an unhandled exception was thrown.
Type: System.ArgumentException
Message: '', hexadecimal value 0x1D, is an invalid character.
Stack Trace:    at System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize)
   at System.Xml.XmlUtf8RawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd)
   at System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
   at System.Xml.XmlWellFormedWriter.WriteString(String text)
   at System.Xml.XmlWriter.WriteAttributeString(String localName, String value)
   at Microsoft.TeamFoundation.Build.Workflow.Tracking.BuildInformationNode.ToXml(XmlWriter writer)
   at Microsoft.TeamFoundation.Build.Workflow.Tracking.FileTrackingParticipant.FlushToFile(IList`1 nodesToSave, String file)

为了避免这种崩溃,我捕获了生成的异常并抛出了一个信息较少的新异常。我不喜欢这样做(松散的堆栈跟踪到问题的实际来源,无法显示原始异常消息),并且更愿意学习另一种记录原始异常信息的方法。并避免使 TFS 构建代理崩溃。

4

1 回答 1

1

试试这个(未经测试):

protected override void Execute(CodeActivityContext context)
{
    try {
        string xmlText = @"<stdout>... &#x1D; ...</stdout>";
        XDocument doc = XDocument.Parse(xmlText);
    } catch (Exception ex) {
        throw new Exception("Can't parse XML Document", ex);
    }
}

如果这仍然使构建过程崩溃(可能 ex.Message 字符串包含错误的 XML),那么向 Microsoft 提交错误

于 2013-04-05T21:22:09.327 回答