Вопрос по c#, memorystream – преобразовать строку в поток памяти - поток памяти не расширяется?

35

я пытался записать строку в поток памяти, но не удалось с сообщением об ошибке:

Memory stream is not expandable.

строка кода, которая вызывает эту проблему:

context.Response.Filter = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(myPage));

у кого-нибудь есть обходной путь / исправить это?

трассировки стека:

[NotSupportedException: Memory stream is not expandable.]
   System.IO.MemoryStream.set_Capacity(Int32 value) +9385744
   System.IO.MemoryStream.EnsureCapacity(Int32 value) +50
   System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count) +265
   System.Web.HttpWriter.FilterIntegrated(Boolean finalFiltering, IIS7WorkerRequest wr) +9155697
   System.Web.HttpResponse.FilterOutput() +159
   System.Web.CallFilterExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +52
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
Stacktrace, пожалуйста. leppie
Что ты пытаешься сделать? Из того, что я получил в документации,HttpResponse.Filter не предназначен для такого использования. Etienne de Martel
что такое `mypage 'строка? msarchet
Да, но если вы хотите вывести материал в ответ, почему бы просто не позвонитьWrite? Что ты здесь пытаешься сделать? Etienne de Martel
@msarchet = да, это строка. Dementic

Ваш Ответ

4   ответа
79

Следующий код работает правильно для меня

public class Foo
{
    public static void Main()
    {
        var myPage = "test string";
        var repo =  new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(myPage));
    }
}

Кажется, что правильный способ сделать это - создатьMemoryStream используя конструктор по умолчанию

var repo = new System.IO.MemoryStream();

а затем напишите ему

var stringBytes = System.Text.Encoding.UTF8.GetBytes(myPage);
repo.Write(stringBytes, 0, stringBytes.Length);

если вы хотите иметь возможность читать поток как обычно (например, с помощью StreamReader), то вам также необходимо вызвать:

repo.Seek(0, SeekOrigin.Begin);
3

который добавляет данные, будет более подходящим.

Минимально проверено. Предполагается, что вы хотите, чтобы текст записывался, когда поток очищается, а затем только один раз.

public class AppendTextFilter : Stream
{
    private Stream Filter { get; set; }
    private string Text { get; set; }
    private bool TextWritten { get; set; }

    public AppendTextFilter( Stream filter, string text )
    {
        this.Filter = filter;
        this.Text = text;
    }

    public override bool CanRead { get { return Filter.CanRead; } }

    public override bool CanSeek { get { return Filter.CanSeek; } }

    public override bool CanWrite { get { return Filter.CanWrite; } }

    public override void Flush()
    {
        if (!TextWritten)
        {
            var bytes = Encoding.UTF7.GetBytes( Text );
            Filter.Write( bytes, 0, bytes.Length );
            TextWritten = true;
        }
        Filter.Flush();
    }

    public override long Length { get { return Filter.Length + Text.Length; } }

    public override long Position
    {
        get
        {
            return Filter.Position;
        }
        set
        {
            Filter.Position = value;
        }
    }

    public override int Read( byte[] buffer, int offset, int count )
    {
        return Filter.Read( buffer, offset, count );
    }

    public override long Seek( long offset, SeekOrigin origin )
    {
        return Filter.Seek( offset, origin );
    }

    public override void SetLength( long value )
    {
        Filter.SetLength( value );
    }

    public override void Write( byte[] buffer, int offset, int count )
    {
        Filter.Write( buffer, offset, count );
    }
}
отличная работа, TY! Dementic
3

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

Тем не менее,HttpResponse.Filter по сути это:фильтр, В документации говорится:

объект Stream и устанавливаете свойство Filter для объекта Stream, весь вывод HTTP, отправленный функцией Write, проходит через фильтр.

Таким образом, данные в конечном итоге записываются вMemoryStream, Так что это поможет узнать, чего вы пытаетесь достичь, именно потому, чтоMemoryStream не сделал бы полезный фильтр ...

я пытаюсь манипулировать ответом, добавил текст на страницу. это оно. Dementic
2
            byte[] buffer = File.ReadAllBytes("test.xml");
            XmlDocument doc = new XmlDocument();
            using (MemoryStream output = new MemoryStream())
            {
                using (MemoryStream ms = new MemoryStream(buffer ))
                {
                    doc.Load(ms);
                }
                // Make changes to your memory stream here
                doc.Save(output);//Output stream has the changes.
            }

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