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

在Minimal API中使用Patch方法遇CosmosDb反序列化问题求助

问题解决:Cosmos DB Patch操作反序列化失败

错误原因

Microsoft.Azure.Cosmos.PatchOperation是Cosmos SDK的内部类型,它没有公开无参构造函数,也未标注JsonConstructorAttribute,导致System.Text.Json无法直接将请求体的JSON反序列化为该类型实例。

解决方案

通过自定义DTO接收前端的Patch请求,再将DTO转换为Cosmos SDK的PatchOperation实例。

步骤1:定义Patch请求DTO

创建一个与前端请求结构匹配的数据传输对象:

public class PatchRequestDto
{
    public string Op { get; set; }
    public string Path { get; set; }
    public object Value { get; set; }
}

步骤2:修改API端点逻辑

在端点中接收DTO列表,转换为Cosmos支持的PatchOperation,并处理路径格式(Cosmos要求路径以/开头):

[HttpPatch]
public static async Task<IResult> Patch(ICarService service, string id, string partitionKey, 
    [FromBody]List<PatchRequestDto> patchRequests)
{
    var patchOperations = new List<PatchOperation>();
    foreach (var req in patchRequests)
    {
        // 格式化路径,确保符合Cosmos要求
        var formattedPath = req.Path.StartsWith("/") ? req.Path : $"/{req.Path}";
        
        switch (req.Op.ToLower())
        {
            case "replace":
                patchOperations.Add(PatchOperation.Replace(formattedPath, req.Value));
                break;
            case "add":
                patchOperations.Add(PatchOperation.Add(formattedPath, req.Value));
                break;
            case "remove":
                patchOperations.Add(PatchOperation.Remove(formattedPath));
                break;
            default:
                return Results.BadRequest($"不支持的Patch操作类型: {req.Op}");
        }
    }

    var updatedCar = await service.UpdatePatchAsync(id, partitionKey, patchOperations);

    if (updatedCar == null)
    {
        return Results.NotFound();
    }
    return Results.Ok(updatedCar);
}

步骤3:修正服务层方法返回值

PatchItemAsync返回的是ItemResponse<Car>而非直接的Car,需要调整服务方法获取实际资源:

public async Task<Car> UpdatePatchAsync(string id, string partitionKey, List<PatchOperation> patchOperations)
{
    var response = await _container.PatchItemAsync<Car>(id, new PartitionKey(partitionKey), patchOperations);
    return response.Resource;
}

调整前端请求格式

确保请求是数组格式(因为接口接收的是列表):

[
    {
        "op": "replace",
        "path": "age",
        "value": 22
    }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:10:26