Правильный способ использования Context.Response.Write() для очень длинной строки Json

Я использую iis и asp.net с С#.

У меня есть строка JSON, которую я создаю с помощью JavaScriptSerializer, с MaxJsonLength, установленным как Int32.MaxValue, теперь я хочу вернуть это с помощью response.write, например, Response.Write(myJsonString), но мне интересно, это правильный способ возврата Это? Есть ли какие-либо проблемы, если строка очень длинная (может также содержать огромные закодированные байты с базой 64), если она все еще находится в пределах длины int32.maxvalue, есть ли какие-либо ограничения со стороны самого IIS (как в максимальной длине, которую я могу вернуть)? Или мне следует написать цикл для отправки символа строки за символом и сброса ответа через каждые x символов?

Кроме того, должен ли я добавить спецификацию UTF8 перед response.write, чтобы убедиться, что я могу правильно использовать строку JSON на стороне получателя? Есть ли какие-либо последствия, если строка JSON содержит байты в кодировке base64?


person black eyed pea    schedule 24.01.2013    source источник
comment
Я бы подумал, что в ситуации, когда ответ большой, нужно было бы получить поток ответа и записать его вместо использования Response.Write(). Хотя не уверен на 100%.   -  person JLRishe    schedule 24.01.2013


Ответы (1)


теперь я хочу вернуть это с помощью response.write, например, Response.Write(myJsonString), но мне интересно, это правильный способ вернуть его?

Вместо использования класса JavaScriptSerializer вы можете использовать JSON.NET или встроенный < href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx" rel="nofollow">DataContractJsonSerializer, оба из которых позволяют сериализовать напрямую в выходной поток:

var serializer = new JsonSerializer();
serializer.Serialize(context.Response.Output, objectToSerialize);

Таким образом, вам не нужно загружать всю строку JSON в память.

есть ли какие-либо проблемы, если строка очень длинная (может также содержать огромные закодированные байты с базой 64), если она все еще находится в пределах длины int32.maxvalue, есть ли какие-либо ограничения от самого iis (как в максимальной длине, которую я могу вернуть)

Что касается IIS, я не думаю, что возникнут проблемы. Но, как я упоминал ранее, вы будете потреблять много памяти на своем сервере, если будете выполнять сериализацию в строку, а не напрямую передавать ее клиенту.

или я должен написать цикл для отправки символа строки за символом и сброса ответа через каждые x символов?

Это не сильно поможет, так как вся строка JSON все еще хранится в памяти.

Кроме того, я тоже хочу спросить, должен ли я добавить ut8 bom в начало response.write, чтобы убедиться, что я могу правильно использовать строку json на стороне получателя?

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

person Darin Dimitrov    schedule 24.01.2013
comment
да, я слышал о сериализаторе контрактов и json.net, но пока я хочу использовать только javascriptserializer, спасибо за предложение, это хорошая идея. - person black eyed pea; 24.01.2013
comment
Если вы хотите использовать JavaScriptSerializer, то ваш подход к использованию Response.Write просто отличный. - person Darin Dimitrov; 24.01.2013