有没有办法为每个 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
为每个请求解决此问题。但是,由于解析器也缓存在单例/静态上下文中,因此要解决每个请求的方法很长。
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
为每个请求解决此问题。但是,由于解析器也缓存在单例/静态上下文中,因此要解决每个请求的方法很长。