Используя MemoryStream для выписывания к XML

Хостинговые службы запускаются при запуске хоста. В WebHost размещенные сервисы будут запущены сразу после запуска приложения . Это означает, что при правильной реализации ваша размещенная служба будет работать без запроса на вход.

Когда я пробую ваш пример размещенной службы в новом приложении ASP.NET Core, он работает просто отлично, поэтому, если он не работает для вас, то, очевидно, ваша фактическая реализация KontolerTimer не верна .

8
задан Dscoduc 28 January 2009 в 08:10
поделиться

6 ответов

MemoryStream версия расточительна в этом случае. MemoryStream полезно, если Вы хотите выполнить Stream- как работа, но не хотят фактический файл. Если Вы пишете файл, то просто пишут в файл. Это избегает потребности буферизовать все данные в памяти.

15
ответ дан 5 December 2019 в 07:37
поделиться

Это - излишество и отходы.

Два ключевых подхода на основе

  1. Вы не знаете полную структуру документа до конца.
  2. Поскольку Вы 'создаете' части документа, Вы знаете, что они - конечная форма этой части документа.

первое требует создания в модели памяти документа (для которого DOM является моделью, разработан). После того как Вы закончены с ним просто пишущий непосредственно в поток файла, прекрасен.

Второе позволяет Вам сохранять значительную память и сложность и просто использовать XmlWriter, который может указать непосредственно в конец на поток (в этом случае поток файла).

Ни на каком этапе это необходимый для использования MemoryStream

2
ответ дан 5 December 2019 в 07:37
поделиться

Если Вы (по некоторым причинам) хотите гарантировать XmlWriter succeedes (т.е. иначе файл мог бы быть усеченным, но в большинстве случаев это произойдет из-за - как упомянуто - не закрывающие тэги), можно использовать временный поток файла, fx что-то подобное этому:

public class TempFileStream : FileStream
{

    public TempFileStream(Action<string> onClose)
        : base(Path.GetTempFileName(), FileMode.OpenOrCreate, FileAccess.ReadWrite)
    {
        this.CloseDelegate = onClose;
    }

    protected Action<string> CloseDelegate 
    {
        get;
        set;
    }

    public override void Close()
    {
        base.Close();
        if (File.Exists(this.Name))
        {
            this.CloseDelegate(this.Name);
        }
    }

}

Используемый как:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

using (TempFileStream tfs = new TempFileStream(f => File.Move(f, filename))
using (XmlWriter writer = XmlWriter.Create(tfs, settings))
{
    writer.WriteStartDocument(true);
    writer.WriteStartElement("parentelement");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

Это не использует большую память (конечно, она только делает/делает больше смысла, когда получающийся XML является большим),

1
ответ дан 5 December 2019 в 07:37
поделиться

Вы не должны использовать MemoryStream для использования XmlWriter. XmlWriter может непосредственно записать в файл; можно использовать другую перегрузку XmlWriter. Создайте метод, который берет имя файла в качестве аргумента, или вместо того, чтобы писать в MemoryStream, Вы могли также записать в XmlTextWriter или FileStream.

Так, Вы 2-й codesnippet могли быть записаны как:

using( FileStream fs = ... )
{
    XmlWriter writer = XmlWriter.Create (fs);
}

AFAIK, XmlWriter не защитит Вас от создания неправильно построенного Xml.

0
ответ дан 5 December 2019 в 07:37
поделиться

Это правда, что подход с потоком памяти расточителен для простых операций, но он очень полезен для таких случаев, как сохранение xml как зашифрованного файла, как сжатого файла и т. д.

3
ответ дан 5 December 2019 в 07:37
поделиться

Я думаю, что использование потока памяти было бы полезно при создании документа в веб-приложении или веб-сервисе. Местоположение файла может конфликтовать с другим процессом, который может выполнять ту же самую обработку, что может привести к недействительным результатам. В потоке памяти обработка должна быть разделена.

1
ответ дан 5 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: