升级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
相关产品推荐
相关产品推荐

