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

使用Microsoft Graph API更新SharePoint列表项遇请求错误问题咨询

解决Microsoft Graph C# PATCH更新ListItem返回Bad Request的问题

这种情况我之前也踩过坑——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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:50:31