You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Newtonsoft.Json至11后TFS WebAPI的UpdateWorkItemAsync调用失败

解决Newtonsoft.Json 11.x下TFS PatchDocument序列化失败问题

我之前也踩过这个坑!当把Newtonsoft.Json从9.0.0升级到11.0.0之后,TFS Web API的PatchDocument确实会出现序列化后变成空JSON({})的问题,本质是高版本Json.NET的默认序列化行为发生了变化,导致PatchDocument的操作内容没有被正确序列化出来。

下面是几个亲测有效的解决办法:

1. 手动配置Json序列化规则

PatchDocument本质是继承自List<Operation>的自定义集合类型,高版本Json.NET默认没有正确处理它的元素序列化。你可以通过自定义JsonSerializerSettings来强制序列化所有必要属性:

// 创建自定义序列化配置
var jsonSettings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto,
    ContractResolver = new DefaultContractResolver
    {
        IgnoreSerializableAttribute = false,
        IgnoreSerializableInterface = false
    }
};

// 构建你的Patch操作
var patchDoc = new PatchDocument();
patchDoc.Add(new Operation
{
    OperationType = Operation.Add,
    Path = "/fields/System.Title",
    Value = "更新后的工作项标题"
});

// 使用自定义配置序列化PatchDocument
var serializedPatch = JsonConvert.SerializeObject(patchDoc, jsonSettings);
var requestContent = new StringContent(serializedPatch, Encoding.UTF8, "application/json-patch+json");

// 调用UpdateWorkItemAsync(或者直接用HttpClient发起请求)
var tfsClient = new WorkItemTrackingHttpClient(new Uri("你的TFS服务器地址"), new VssCredentials());
var updatedWorkItem = await tfsClient.UpdateWorkItemAsync(
    JsonConvert.DeserializeObject<List<Operation>>(serializedPatch), 
    workItemId);

这里的关键是让序列化器识别PatchDocument的集合特性和Operation的可序列化属性,避免它被当成空对象处理。

2. 更新TFS相关NuGet包

微软后续发布的Microsoft.TeamFoundationServer.Client包已经修复了和高版本Json.NET的兼容性问题。你可以尝试把这个NuGet包更新到最新稳定版,很多时候只需要更新SDK就能自动解决序列化冲突,不需要手动配置序列化规则。

3. 检查请求头的媒体类型

确保你的请求头指定了正确的媒体类型application/json-patch+json,TFS Web API对这个类型的请求有特定的序列化处理,少了这个头也可能导致PatchDocument无法被正确解析。


内容的提问来源于stack exchange,提问作者Ken B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:23:32