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

本文关键字:ASP net v2 访问 | 更新日期: 2023-09-27 18:27:57

我们遇到了一个非常奇怪的问题,下面的代码在所有开发人员的机器/我们的2台测试服务器上都能很好地工作,无论是代码还是构建版本,但是当它在带有windows 2003 server和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();
    }
}

知道它为什么要这么做吗?

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

对于您的Serialize,请使用using来防止流保持打开

类似这样的东西:

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

我最初认为这是因为你要关闭流然后关闭编写器-你应该关闭编写器,因为它也会关闭流:http://msdn.microsoft.com/en-us/library/system.io.streamwriter.close(v=vs.80).aspx.

然而,尽管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(); 
  } 
} 

现在你直接处理流,它只会关闭一次——最肯定的是消除了这个奇怪的错误——我敢打赌,这可能与服务包或类似的东西有关。