2012-03-16 71 views
2

我們有一個非常奇怪的問題,下面的代碼在所有開發人員機器/我們的2個測試服務器上工作正常,無論是使用代碼還是使用內置版本,但是當它運行時在虛擬機與Windows 2003服務器和asp.net v2.0它會引發錯誤無法訪問封閉的流ASP.net 2.0版

無法訪問封閉的流。

public String convertResultToXML(CResultObject[] state) 
{ 
    MemoryStream stream = null; 
    TextWriter writer = null; 
    try 
    { 
     stream = new MemoryStream(); // read xml in memory 
     writer = new StreamWriter(stream, Encoding.Unicode); 
     // get serialise object 
     XmlSerializer serializer = new XmlSerializer(typeof(CResultObject[])); 
     serializer.Serialize(writer, state); // read object 
     int count = (int)stream.Length; // saves object in memory stream 
     byte[] arr = new byte[count]; 
     stream.Seek(0, SeekOrigin.Begin); 
     // copy stream contents in byte array 
     stream.Read(arr, 0, count); 
     UnicodeEncoding utf = new UnicodeEncoding(); // convert byte array to string 
     return utf.GetString(arr).Trim(); 
    } 
    catch 
    { 
     return string.Empty; 
    } 
    finally 
    { 
     if (stream != null) stream.Close(); 
     if (writer != null) writer.Close(); 
    } 
} 

任何想法,爲什麼會這樣?

+2

這是幹什麼的? – 2012-03-16 13:16:39

+4

這是使用'using'的一個很好的理由。 – 2012-03-16 13:17:12

+0

@ Moo-Juice使用只是轉換爲嘗試終於 – Aristos 2012-03-16 13:18:18

回答

0

爲了您Serialize使用using防止流保持開放

事情是這樣的:

using (StreamWriter streamWriter = new StreamWriter(fullFilePath)) 
{ 
    xmlSerializer.Serialize(streamWriter, toSerialize); 
} 
0

我本來以爲那是因爲你關閉流然後關閉作家 - 你應該關閉的作家,因爲它會關閉流也: http://msdn.microsoft.com/en-us/library/system.io.streamwriter.close(v=vs.80).aspx

但是,儘管有MSDNs的保護,但我無法看到任何證據表明它在反映代碼時確實會這樣做。

但是,看看你的代碼,我看不出你爲什麼首先使用作者。如果你這樣改變你的代碼,我敢打賭,(我已經採取了異常吞嚥太)它會好起來:

public String convertResultToXML(CResultObject[] state) 
{ 
    using(var stream = new MemoryStream)  
    { 
    // get serialise object 
    XmlSerializer serializer = new XmlSerializer(typeof(CResultObject[])); 
    serializer.Serialize(stream, state); // read object 
    int count = (int)stream.Length; // saves object in memory stream 
    byte[] arr = new byte[count]; 
    stream.Seek(0, SeekOrigin.Begin); 
    // copy stream contents in byte array 
    stream.Read(arr, 0, count); 
    UnicodeEncoding utf = new UnicodeEncoding(); // convert byte array to string 
    return utf.GetString(arr).Trim(); 
    } 
} 

現在你隨大流的工作,直接,而且它我只會關閉一次 - 絕對是擺脫這個奇怪的錯誤 - 我敢打賭可能是與服務包或類似的東西有關。

相關問題