convert string to memory stream - Memory stream is not expandable?

Rafael Herscovici picture Rafael Herscovici · Nov 11, 2011 · Viewed 78.3k times · Source

i was trying to write a string to a memory stream, but failed with the error message:

Memory stream is not expandable.

the line of code that produces this problem:

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

anyone have a workaround/fix for that?

stacktrace:

[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

Answer

msarchet picture msarchet · Nov 11, 2011

The following code works correctly for me

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

It seems that the correct way to do this is to create the MemoryStream using the default constructor

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

and then write to it

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

if you want to be able to read the stream as normal (eg using a StreamReader) then you will also need to call:

repo.Seek(0, SeekOrigin.Begin);