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());
}

HttpResponse для контроллера XYZ Попробуйте 1:

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

HttpResponse для контроллера XYZ Попробуйте 2: - не начинается с $ id 1

{ "$ id": "28", <--- НЕ УВЕРЕН, ПОЧЕМУ НА ВТОРОЙ ЗАПРОС $ ID начинается с 28 :( -> "счет": { "$ id": "29" , "тип": "ТИП1",

HttpResponse для контроллера XYZ Попробуйте 3: - не начинается с $ id 1

{ "$ id": "55", <--- НЕ УВЕРЕН, ПОЧЕМУ НА ВТОРОЙ ЗАПРОС $ ID начинается с 55 :( -> "счет": { "$ id": "56" , "тип": "ТИП1",

Я использую Newtonsoft.Json (11.0.2)

5
Nainesh Patel 21 Янв 2020 в 03:27

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;
}
2
Nainesh Patel 7 Апр 2020 в 19:45

Я открыл тему на Github, чтобы обсудить это.

По сути, проблема с StatusCode кэшированием значений $id заключается в том, что эта строка кода.

По соображениям производительности NewtonsoftJsonOutputFormatter решил кэшировать JsonSerializer, используемый для сериализации объектов. Это также будет кэшировать IReferenceResolver. Но это будет долгий путь для каждого запроса, так как распознаватель также кэшируется в одноэлементном / статическом контексте.

2
weichch 9 Апр 2020 в 05:31