2011-11-11 12 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

क्या 'MyPage 'एक स्ट्रिंग सीधे है? – msarchet

+0

आप क्या करने की कोशिश कर रहे हैं? प्रलेखन में जो मिला, उससे 'HttpResponse.Filter' का उपयोग इस तरह नहीं किया जाना चाहिए। –

+1

कृपया स्टैकट्रैस करें। – leppie

उत्तर

2

डेटा जोड़ने वाला एक कस्टम स्ट्रीम अधिक उपयुक्त होगा।

न्यूनतम परीक्षण किया गया। मान लें कि स्ट्रीम फ़्लश होने पर आपको लिखा गया टेक्स्ट चाहिए, और फिर केवल एक बार।

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

महान काम, टीवाई! – 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 अनिवार्य रूप से यह है कि: फ़िल्टर फ़िल्टर करें। प्रलेखन में कहा गया है:

जब आप स्ट्रीम ऑब्जेक्ट बनाते हैं और फ़िल्टर ऑब्जेक्ट को स्ट्रीम ऑब्जेक्ट पर सेट करते हैं, तो फ़िल्टर द्वारा भेजे गए सभी 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. 
      } 
संबंधित मुद्दे