有没有办法为每个 HTTP 请求重置 JSON 响应中的 $id? JsonSerializerSettings = PreserveReferencesHandling.Objects

Is there a way to reset $id in JSON response for each HTTP Request? JsonSerializerSettings = PreserveReferencesHandling.Objects

XYZController.cs

[HttpPost]
public async Task<ActionResult> Post([FromBody] T inputContext)
{
       var outputContext = Process(inputContext);
       return StatusCode(200, outputContext );
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc().AddJsonOptions(options =>
            {
                UpdateJsonSettings.ConfigureJsonFormatter(options.SerializerSettings);
            });
}

UpdateJsonSettings.cs

internal static void ConfigureJsonFormatter(JsonSerializerSettings settings)
{
       settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
       settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
       settings.Converters.Add(new StringEnumConverter());
}

XYZ 控制器的 HttpResponse 尝试 1:

{ "$id": "1", "bill":{ "$id": "2", "type": "TYPE1",

XYZ 控制器的 HttpResponse 尝试 2:-- 不以 $id 1 开头

{ "$id": "28", <--- 不确定为什么在第二个请求中 $ID 以 28 开头 :( --> "bill":{ "$id": "29", "type": "TYPE1",

XYZ 控制器的 HttpResponse 尝试 3:-- 不以 $id 1 开头

{ "$id": "55", <--- 不确定为什么在第二个请求中 $ID 以 55 开头 :( --> "bill":{ "$id": "56", "type": "TYPE1",

我正在使用 Newtonsoft.Json (11.0.2)

我学到了很多东西!

问题出在 StatusCode 方法中,它正在返回 ObjectResult。将方法签名更改为 IActionResult 并返回 JsonResult 后,它工作正常。此外,API 性能得到改善。

[HttpPost]
public async Task<IActionResult> Post([FromBody] T inputContext)
{
       var outputContext = Process(inputContext);
       var jsonResult = new JsonResult(outputContext);
       jsonResult.StatusCode = 200;
       return jsonResult;
}

我开了一个thread on Github来讨论这个。

基本上,StatusCode 缓存 $id 值的问题是因为 this line of code.

出于性能原因,NewtonsoftJsonOutputFormatter 选择缓存 JsonSerializer 用于序列化对象。这也将缓存 DefaultReferenceResolver 及其内部计数器。

正如我在 Github 问题中所说,有一种方法可以使用自定义 IReferenceResolver 为每个请求解决此问题。但是,由于解析器也缓存在单例/静态上下文中,因此要解决每个请求的方法很长。