我正在尝试在 .NET Core 3.0 Preview 9 web api 上实现 JsonPatch。

该模型:

public class TestPatch
{
    public string TestPath { get; set; }
}

Web API 端点:
[HttpPatch()]
public async Task<IActionResult> Update([FromBody] JsonPatchDocument<TestPatch> patch)
{
   ...........
   return Ok();
}

JSON 有效负载:
[
    {
        "op" : "replace",
        "path" : "/testPath",
        "value" : "new value"
    }
]

通过 Postman 使用 PATCH,我收到此错误:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|492c592-4f7de4d16a32b942.",
"errors": {
    "$": [
        "The JSON value could not be converted to Microsoft.AspNetCore.JsonPatch.JsonPatchDocument`1[Test.Models.TestPatch]. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
    ]
}
}

这是来自 Postman 的完整请求/响应
PATCH /api/helptemplates HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.16.3
Accept: */*
Cache-Control: no-cache
Postman-Token: a41813ea-14db-4664-98fb-ee30511707bc
Host: localhost:5002
Accept-Encoding: gzip, deflate
Content-Length: 77
Connection: keep-alive
[
{
"op" : "replace",
"path" : "/testPath",
"value" : "new value"
}
]
HTTP/1.1 400 Bad Request
Date: Thu, 12 Sep 2019 21:13:08 GMT
Content-Type: application/problem+json; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked
{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"|492c593-4f7de4d16a32b942.","errors":{"$":["The JSON value could not be converted to Microsoft.AspNetCore.JsonPatch.JsonPatchDocument`1[Test.Models.TestPatch]. Path: $ | LineNumber: 0 | BytePositionInLine: 1."]}}

JsonPatch 引用:
<PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.0.0-preview9.19424.4" />

我的代码有什么问题?

谢谢。

最佳答案

使用JsonPatch包启用了对Microsoft.AspNetCore.Mvc.NewtonsoftJson的支持。要启用此功能,应用程序必须:

  • 安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet软件包。
  • 更新项目的Startup.ConfigureServices方法以包括一个
    调用AddNewtonsoftJson

  • services
        .AddControllers()
        .AddNewtonsoftJson();
    
    AddNewtonsoftJson与MVC服务注册方法兼容:
  • AddRazorPages
  • AddControllersWithViews
  • AddControllers

  • 但是,如果您使用的是 asp.net core 3.x ,则
    AddNewtonsoftJson替换了基于System.Text.Json的输入和输出格式化程序,该格式化程序用于格式化所有 JSON内容。要使用JsonPatch添加对Newtonsoft.Json的支持,同时保持其他格式化程序不变,请按以下方式更新项目的Startup.ConfigureServices:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers(options =>
        {
            options.InputFormatters.Insert(0, GetJsonPatchInputFormatter());
        });
    }
    
    private static NewtonsoftJsonPatchInputFormatter GetJsonPatchInputFormatter()
    {
        var builder = new ServiceCollection()
            .AddLogging()
            .AddMvc()
            .AddNewtonsoftJson()
            .Services.BuildServiceProvider();
    
        return builder
            .GetRequiredService<IOptions<MvcOptions>>()
            .Value
            .InputFormatters
            .OfType<NewtonsoftJsonPatchInputFormatter>()
            .First();
    }
    

    前面的代码需要引用Microsoft.AspNetCore.Mvc.NewtonsoftJson,下面的using语句:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Formatters;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Options;
    using System.Linq;
    

    可以在link中找到上述内容的简要说明和文档。

    关于asp.net - 如何在 .NET Core 3.0 Preview 9 中正确实现 JsonPatch?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57914725/

    10-10 21:45