Всем привет.
Столкнулся с такой ситуацией. На сайте на лету генерятся вордовские документы в формате XML и отдаются клиенту в браузер.
В нижеприведенном отрывке кода в XML-шаблон документа по меткам вставляются изображения.
И все бы ничего, но при достаточно больших изображениях получаем достаточно большие строки.
Например у меня тестовый документ потянул приблизительно на 75Mb.
При таких объемах получаю почти гарантированно OutOfMemoryException.
Собственно вопрос как с этим бороться? Вроде все что мог на StringBuilder перевел.
И второй вопрос. Заметил что на серваке вероятность получения OutOfMemoryException возрастает в зависимости от количества одновременных запросов на генерацию документа. И совершенно точно что физически на сервере память имеется и ее много. В пуле приложения ограничений на память не наблюдаю. Что это может значить?
string fileName = String.Format("файл_{0}.doc", pOrderId);
StringBuilder strBody = new StringBuilder();
try
{
...
strBody.Append(_str_val);
foreach (var op in query)
{
int pictId = op.Field<int>("pict-id");
byte[] pictVal = op.Field<byte[]>("pict-val");
string pictType = op.Field<string>("pict-type");
using (MemoryStream ms = new MemoryStream(pictVal))
{
using (System.Drawing.Image img = System.Drawing.Image.FromStream(ms))
{
OfficePictureWriter opw = OfficePictureWriter.Create(img, "", String.Format("{0}", pictId));
string pict = opw.ToString();
string mark = String.Format("#{0}#", pictId);
strBody.Replace( mark, pict );
}
}
}
Response.AppendHeader("Content-Type", "application/msword");
Response.AppendHeader("Content-disposition", "attachment; filename=" + fileName);
Response.Write(strBody.ToString());
Response.End();