无法访问封闭的流ASP.net v2.0

时间:2012-03-16 13:11:35

标签: c# asp.net

我们有一个非常奇怪的问题,下面的代码在所有开发人员机器/我们的2个测试服务器上工作正常,包括代码和内置版本,但是当它在带有Windows 2003服务器和asp的虚拟机上运行时。 net v2.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 个答案:

答案 0 :(得分:0)

对于Serialize使用using,阻止流保持打开

这样的事情:

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

答案 1 :(得分:0)

我原本以为是因为你关闭了流然后关闭了作者 - 你应该关闭作者,因为它也将关闭流:http://msdn.microsoft.com/en-us/library/system.io.streamwriter.close(v=vs.80).aspx。< / p>

然而,尽管MSDN受到了保护,但我无法看到任何证据表明它在反映代码时确实会这样做。

但是,看看你的代码,我看不出为什么你首先使用这个编写器。我敢打赌,如果你改变你的代码(我已经把异常吞下去了)它会好起来的:

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(); 
  } 
} 

现在你正在直接使用流,它只会被关闭一次 - 绝对是摆脱这个奇怪的错误 - 我会打赌这可能与服务包或类似的东西有关。