поток памяти не сохраняет весь контент - PullRequest
0 голосов
/ 24 февраля 2012

Большая проблема с памятью в c #.Мое приложение получает html сообщения электронной почты, анализирует значения src изображений, которые являются вложениями, и изменяет эти значения src на другие.Это прекрасно работает.Проблема в том, что я должен сохранить результирующий HTML в списке sharepoint.и это так, но когда я вижу контент в списке sharepoint, он не показывает электронную почту, только некоторую его часть.Я не знаю, если поток памяти вообще не сохраняет содержимое, или строка сохраняет результат, не имеет достаточной емкости для сохранения того, что хранит поток памяти.Если у кого-то есть идеи, пожалуйста, напишите их!

string SRC = "";
int indice = 0;
//Console.WriteLine(body);

HtmlDocument email = new HtmlDocument();
email.LoadHtml(body);
Console.WriteLine("bodylength: " + body.Length);//original length

foreach (HtmlNode img in email.DocumentNode.SelectNodes("//img"))
{
    SRC = img.GetAttributeValue("src", null);
    for (int i = 0; i < contentIDS.Count; i++)
    {
        if (SRC.Equals(contentIDS[i].ToString()))
        {
            //Console.WriteLine("contents" + contentIDS[i].ToString());
            indice = i;
            break;
        }
    }
    img.SetAttributeValue("src", urls[indice].ToString());
    Console.WriteLine(img.GetAttributeValue("src", null));
}

//se guarda en memoria los cambios hechos en el html y se retorna e tipo string el html con los cambios realizados
MemoryStream memoryStream = new MemoryStream();
email.Save(memoryStream);
//memoryStream.SetLength(body.Length);
memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
StreamReader streamReader = new StreamReader(memoryStream);
return streamReader.ReadToEnd();//this is then store in a string when i call this method. The lenght of that string is much much smaller than the original one.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Вы можете упростить это, используя перегрузку Save, которая использует TextWriter:

HtmlDocument email = new HtmlDocument();
using (var sw = new StringWriter())
{
    email.Save(sw);
    return sw.ToString();
}

Обратите внимание, что вы всегда должны располагать объекты, которые реализуют IDisposable (самый простой способ - обернуть их внутри using блоков, как показано здесь).

0 голосов
/ 24 февраля 2012

Я подозреваю, что вы получаете всю строку обратно сюда, а это не Flush() поток в другом месте - вероятно, когда вы сохраняете его на диск.Код здесь выглядит нормально.

Если вы разместите функцию, в которой вы ее сохранили, я думаю, что мы увидим проблему там.

...