Эффективность памяти: передача Html-кода страницы aspx через выделенный код
-
20-09-2019 - |
Вопрос
Моя цель — сгенерировать код aspx страницы в виде строки. Я вызываю приведенный ниже код кодовой части через асинхронный запрос в javascript и получаю ответ через Response.Write.
string html = string.Empty;
using (var memoryStream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(memoryStream))
{
var htmlWriter = new HtmlTextWriter(streamWriter);
base.Render(htmlWriter);
htmlWriter.Flush();
memoryStream.Position = 0;
using (var streamReader = new StreamReader(memoryStream))
{
html = streamReader.ReadToEnd();
streamReader.Close();
}
}
}
Response.Write(html);
Response.End();
Я хочу спросить, является ли приведенный выше код эффективным с точки зрения использования памяти, я думаю о «выходности», которую можно использовать, поскольку он оценивается лениво. Можете ли вы предложить эффективность использования памяти в приведенном выше коде?
Решение
Используйте StringWriter вместо MemoryStream, StreamWriter и StreamReader:
string html;
using (StringWriter stream = new StringWriter()) {
using (HtmlTextWriter writer = new HtmlTextWriter(stream)) {
base.Render(writer);
}
html = stream.ToString();
}
Response.Write(html);
Response.End();
StringWriter внутренне использует StringBuilder.Метод ToString вызывает ToString в Stringguilder, поэтому он возвращает внутренний строковый буфер в виде строки.Это означает, что строка создается только один раз и не копируется туда и обратно.
Другие советы
Ваш метод сохраняет копию html по адресу html
переменная и еще одна в memoryStream
.Попробуй это:
base.Render(new HtmlTextWriter(Response.Output));
Response.End();
Хотя это может сработать, я не уверен, чего вы пытаетесь достичь.