Ответ Json усекается в web api с использованием ядра asp.net

У меня есть веб-api, который возвращает объект json для меня на моем сайте. проблема такова:

[{ "партии": 1, "Дата": "03/01/2016", "количество": "27.28", "статус": "\" 01BI000657\""}, { "партии": 2, "дата ":" 04/01/2016", "количество": "49.25", "статус": "\" 01BI000699\""}, { "партии": 3, "дата ":" 05/01/2016", "количество": "56,31", "статус": "\" 01BI000745\ "}, {" рассрочка ": 4," дата ":" 06/01/2016", "количество": "53,43", "статус": "\" 01BI000811\ "}, {" рассрочка ": 5," дата ":" 07/01/2016", "количество": "60,52", "статус": "\" 01EI279932\""}, { "партии": 6, "дата ":" 08/01/2016", "количество": "57.95", "статус": "\" 01BI000934\""}, { "партии": 7, "дата ":" 09/01/2016", "количество": "60.24", "статус": "\" 01BI001015\""}, { "партии": 8, "дата ":" 10/01/2016", "количество": "67,36", "статус": "\" 01EI298127\ "}, {" рассрочка ": 9," дата ":" 11/01/2016", "количество": "65,30", "статус": "\" 01BI001185\ "}, {" рассрочка ": 10," дата ":" 12/01/2016", "количество": "72,44", "статус": "\" 01BI001277\ "}, {" рассрочка ": 11," дата ":" 01.01.2017", "количество": "70,75", "статус": "\" 01BI001380\ "}, {" рассрочка ": 12," дата ":" 02/01/2017", "количество": "73,55", "статус": "\" 01BI001486\ "}, {" рассрочка ": 13," да т.е ":" 03/01/2017", "количество": "89.28", "статус": "\" 01BI001567\""}, { "партии": 14, "дата ":" 04/01/2017", "количество": "80,00", "статус": "\" 01BI001691\ "}, {" рассрочка ": 15," дата ":" 05/01/2017", "количество": "87,23 "," статус ":" \" 01BI001822 \" "}, {" рассрочка ": 16," дата ":" 06/01/2017", "количество": "86,63", "статус": "\" 01BI002011\"" }, { "партии": 17, "дата ":" 07/01/2017", "количество": "93.89", "статус": "\" 01BI002172\""}, { "партии": 18," дата ":" 08/01/2017", "количество": "93,78", "статус": "\" 01BI002369\ "}, {" рассрочка ": 19," дата ":" 09/01/2017", "количество": "97,49", "статус": "\" \ "}, {" рассрочка ": 20," дата ":" 10/01/2017", "количество": "104,81 "," статус ":" \" \" "}, {" рассрочка ": 21," дата ":" 11/01/2017", "количество": "105,50", "статус": "\" \ "}, {" взнос ": 22," дата ":" 12/01/2017", "количество": "112,87", "статус": "\" \ "}, {" рассрочка ": 23," дата ":" 01/01/2018", "количество": "114,15", "статус": "\" \ "}, {" рассрочка ": 24," дата ":" 02/01/2018", "количество": "118,67", "статус": "\" \ "}, {" рассрочка ": 25," дата ":" 03/01/2018", "количество": "131,57", "статус": "\" \ "}, {" модули

как вы можете видеть, он усекается, он весит 20 килобайт, длина строки - 2033, поэтому я хотел знать, есть ли способ увеличить максимальный размер ответа. Я пробовал MaxJsonLength внутри web.config, но он не работает, возможно, из-за основного аспекта .net, поэтому я немного потерян, почему он усекается.

Ответ 1

Я не знаю, почему ответ json в какой-то момент усекается, но в моем случае (ASP.NET Core 2.0) я должен был сказать Newtonsoft.Json игнорировать циклы ссылок следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );
}

Ответ 2

Одна из причин, по которой это может произойти, - это ошибка при сериализации объекта в JSON. Например, это может быть вызвано полем, отмеченным как обязательное, которого нет в данных. Вывод просто прекращается, и в этом случае не сообщается об исключении.

Убедитесь, что вы можете сериализовать объект json, используя JSonConvert.SerializeObject(), прежде чем возвращать его, и устраните все проблемы.

Ответ 3

Для тех, кто может оказаться здесь, увидев это при обслуживании пространственных типов., ,

Ответ @IngoB заставил проблему исчезнуть, но затем (наряду с комментарием с запахом кода из @FailedUnitTest звучит правдоподобно) в JSON появился гигантский кусок материала, которого я не ожидал из-за своей простой точки, Установка ReferenceLoopHandling на Serialize и отладка позволили мне увидеть детали происходящего, и в итоге я оказался здесь.

Сводка:

  1. Установите пакет NetTopologySuite.IO.GeoJSON
  2. Добавьте что-то подобное в ConfigureServices():

    services.AddMvc(options =>
        {
            options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Point)));
        })
        .AddJsonOptions(options =>
        {
            foreach (var converter in GeoJsonSerializer.Create(new GeometryFactory(new PrecisionModel(), 4326)).Converters)
            {
                options.SerializerSettings.Converters.Add(converter);
            }
        });
    

Ответ 4

Я знаю, что это немного поздно и на него уже могут ответить другие в других статьях, но я исправил это, сериализовав с читателем SQL-запрос и вернув объект, который мгновенно преобразуется в JSON без возврата запроса как JSON с самого начала.

Ответ 5

Усечение в 2033 году заставляет меня думать, что вы получаете только первый фрагмент того, что возвращает SQL Server. Вам нужно объединить все результаты вместе, например:

var queryWithForJson = "SELECT ... FOR JSON";
var conn = new SqlConnection("<connection string>");
var cmd = new SqlCommand(queryWithForJson, conn);
conn.Open();
var jsonResult = new StringBuilder();
var reader = cmd.ExecuteReader();
if (!reader.HasRows)
{
    jsonResult.Append("[]");
}
else
{
    while (reader.Read())
    {
        jsonResult.Append(reader.GetValue(0).ToString());
    }
}