注意Stream.Seek,如果想要重复使用Stream,注意用Seek复位

Stream.Seek

sets the position within the current stream.

今天在做一个XML转换的时候怎么也取不到返回值,真是火大,Review了好几遍也没有发现问题,后来发现是对Stream重复操作,没有复位操作

 

XmlTextWriter writer = new XmlTextWriter(Console.Out);
xslt.Transform(reader, xslArg, writer, null);

MemoryStream retStream=new MemoryStream(4096);
XmlTextWriter writerOut = new XmlTextWriter(retStream,null);
//复位操作,重新加载XmlReader
stream.Seek(0, SeekOrigin.Begin);
reader = XmlReader.Create(stream);
//----
xslt.Transform(reader, xslArg, writerOut);

IBaseMessageFactory factory = new BaseMessageFactory();
IBaseMessagePart part = factory.CreateMessagePart();
part.Data = retStream;
IBaseMessage retMsg = factory.CreateMessage();
retMsg.AddPart("body", part, true);

当时只能够在Console里看到Transform的信息,但是MemoryStream中一直没有东西,后来把Transform到Console关掉,发现MemoryStream里面有东西了,恍然大悟,原来是重复使用了Stream,没有复位

想想在BizTalk Adapter开发时候特别强调了对了流操作要注意Seek(0,SeekOrigin.Begin)复位操作,因为用过一次后,流的偏移offset已经到中间或者结尾了,如果要重新使用流,必须要复位操作,把流的偏移调整到0位.

 

ps:后续操作

  FileStream fsSend = File.Create(sendFile,2048);
  Stream stream = retMessage.BodyPart.Data;
  stream.Seek(0,SeekOrigin.Begin);
            
  byte[] buffer=new byte[4096];
  long bytesToRead = stream.Position;
  int bytesRead;
  while (0!=(bytesRead=stream.Read(buffer,0,buffer.Length)))
  {                
     fsSend.Write(buffer, 0, bytesRead);              
  }

  fsSend.Flush();
posted @ 2007-05-16 15:30  upzone  阅读(2223)  评论(1编辑  收藏  举报