无法访问封闭流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();
}
}
知道它为什么要这么做吗?
对于您的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();
}
}
现在你直接处理流,它只会关闭一次——最肯定的是消除了这个奇怪的错误——我敢打赌,这可能与服务包或类似的东西有关。