使用Microsoft Graph API更新SharePoint列表项遇请求错误问题咨询
这种情况我之前也踩过坑——Graph Explorer里跑的好好的请求,自己用C#写就报Bad Request,多半是请求构造的细节没和Graph要求对齐,咱们一步步排查:
1. 先检查JSON序列化的字段匹配度
Graph API对JSON字段名是大小写敏感的,你在Graph Explorer里用的是CaseNumber,如果C#里的对象序列化后字段名变了(比如小写的casenumber),直接就会触发Bad Request。
解决方法:给你的C#模型属性加上序列化特性,强制输出正确的字段名:
// 用System.Text.Json的情况 public class ListItemUpdateDto { [JsonPropertyName("CaseNumber")] public string CaseNumber { get; set; } } // 用Newtonsoft.Json的情况 public class ListItemUpdateDto { [JsonProperty("CaseNumber")] public string CaseNumber { get; set; } }
调试时可以把序列化后的JSON打印出来,确认和Graph Explorer里的完全一致:
var updateModel = new ListItemUpdateDto { CaseNumber = "13XX17101310238" }; var json = JsonSerializer.Serialize(updateModel); Console.WriteLine(json); // 应该输出 {"CaseNumber": "13XX17101310238"}
2. 确认请求头的Content-Type设置正确
很多时候代码里会漏掉设置Content-Type: application/json,或者不小心设成了text/plain,导致Graph API无法解析请求体。
在构造HttpClient请求时,一定要明确指定:
var httpClient = new HttpClient(); // 别忘了加授权头(比如Bearer token) httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", yourAccessToken); var requestUrl = "https://graph.microsoft.com/v1.0/sites/mysharepoint:/sites/mySite:/lists/myList/items/1582/fields"; var requestContent = new StringContent(json, Encoding.UTF8, "application/json"); var response = await httpClient.PatchAsync(requestUrl, requestContent);
3. 检查权限范围是否匹配
Graph Explorer用的是委派权限(基于当前登录用户的权限),而你的C#代码如果用的是应用权限(后台服务调用),需要确保Azure AD应用注册里已经添加了正确的权限,并且完成了管理员同意:
- 所需权限:
Sites.ReadWrite.All(或者更精细的站点级权限) - 确认权限状态是“已授予管理员同意”
4. 核对请求URL的准确性
代码里拼接URL时容易出错,比如站点标识符、列表名称、Item ID有没有写错。把代码里生成的URL和Graph Explorer里的对比,确保完全一致:
- 比如确认
/sites/mysharepoint:/sites/mySite:/这部分的格式是否正确,如果用站点ID的话,格式应该是/sites/{site-id}
5. 排查请求体是否有多余内容
如果你的C#模型里有额外的属性,序列化后会生成多余的JSON字段(比如$id、CaseNumberSpecified这类),Graph API无法识别就会返回Bad Request。
解决方法:要么精简模型只保留需要更新的字段,要么用匿名对象直接序列化:
var updateData = new { CaseNumber = "13XX17101310238" }; var json = JsonSerializer.Serialize(updateData);
按上面的步骤排查,基本就能定位到问题所在啦。
内容的提问来源于stack exchange,提问作者Muhammad Khurram Bhatti

