2011-11-11 15 views
34

私は、メモリストリームに文字列を書き込もうと が、エラーメッセージで失敗しました。この問題を生成するコードの行を文字列をメモリストリームに変換する - メモリストリームは展開できませんか?

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 
+0

直接 'マイページ」という文字列は何ですか? – msarchet

+0

何をしようとしていますか?私がドキュメントに書いたところから、 'HttpResponse.Filter'はそのように使われることを意図していません。 –

+1

Stacktraceしてください。 – leppie

答えて

2

データを追加するカスタムストリームが適切でしょう。

最小限にテストされました。ストリームがフラッシュされたときにテキストが書き込まれ、その後に1回だけ書き込まれると仮定します。

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); 
    } 
} 
+0

素晴らしい仕事、TY! – Dementic

77

次のコードは、私

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

のために正しく動作するには、これを行うための正しい方法は、デフォルトコンストラクタに

var repo = new System.IO.MemoryStream(); 
を使用して MemoryStreamを作成することであると思われます

してから書いてください

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

あなたは(のStreamReaderを使用した例)通常通り流れを読むことができるようにしたいならば、あなたも呼び出す必要があります:

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

あなたはバイト配列からMemoryStreamを作成するときには、基本的に前記アレイの周囲にラッパーを作成する。つまり、ストリームのバッファは、容量に達すると拡張できません。

ただし、HttpResponse.Filterは、本質的には:フィルタです。

Streamオブジェクトを作成し、FilterプロパティをStreamオブジェクトに設定すると、Writeによって送信されたすべてのHTTP出力がフィルタを通過します。

したがって、データはMemoryStreamに書き込まれます。したがって、MemoryStreamが有用なフィルタを作成しないため、これで正確に達成しようとしていることを知るのに役立ちます。

+0

私はレスポンスを操作しようとしていて、ページにテキストを追加しています。それでおしまい。 – 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. 
      } 
関連する問題