代码之家  ›  专栏  ›  技术社区  ›  Josh Stodola

正在将流从XmlTextWriter复制到文件流

  •  1
  • Josh Stodola  · 技术社区  · 15 年前

    我有一个HTTP处理程序正在绑定 XmlTextWriter 实例到 Response.Output 就像这样…

    Sub GenerateXml(ByRef Response As HttpWebResponse)
        Using Writer As New XmlTextWriter(Response.Output)
            ' Build XML
        End Using
    End Sub
    

    现在,我还希望将相同的XML保存到本地硬盘驱动器(除了流式处理响应之外)。我该怎么做?

    我试过的东西

    1)显然,正在将response.outputstream复制到新的文件流…

        Sub GenerateXml(ByRef Response As HttpWebResponse)
            Using Writer As New XmlTextWriter(Response.Output)
                Build XML Here
            End Using
    
            // Also tried this inside the Using, with and without .Flush()
            CopyStream(Response.OutputStream, File.Create("C:\test.xml"))
        End Sub
    
        Sub CopyStream(ByRef Input As Stream, ByRef Output As Stream)
            Dim Buffer(1024) As Byte
            Dim Read As Integer
    
            Using Input
                Using Output
                    While (Read = Input.Read(Buffer, 0, Buffer.Length)) > 0
                        Output.Write(Buffer, 0, Read)
                    End While
                End Using
            End Using
        End Sub

    我得到“不支持方法”和“NullReference”等错误

    2)使用内存流,然后复制它…

        Using Memory As New MemoryStream()
            Using Writer As New XmlTextWriter(Memory, Encoding.UTF8)
                Build XML Here
            End Using
    
            // Tried outside of the Using, with and without Flush()
            CopyStream(Memory, Response.OutputStream)
            CopyStream(Memory, File.Create("C:\test.xml"))
        End Using
    

    我会出现“无法访问封闭流”之类的错误。

    为什么有这么简单的东西像皮塔?!

    4 回复  |  直到 13 年前
        1
  •  2
  •   user7116    15 年前

    你不能挂线 Response.OutputStream 以那种方式。但是,您可以做两件事之一:

    1. 创建一个调用 Stream.Write 测试文件和 响应.outputstream .

      using (var writerResponse = new XmlTextWriter(Response.OutputStream))
      using (var writerFile = new XmlTextWriter(File.Create(@"c:\test.xml"))
      {
          StartElement(writerResponse, writerFile, @"test");
      }
      
    2. 创建一个包装类,它封装要写入的两个流,并提供所需的所有流方法。( Write 等)。

      public class DualStream : Stream
      {
          public DualStream(Stream first, Stream second)
          {
          }
      
          public override bool CanRead { get { return false; } }
          public override bool CanWrite { get { return true; } }
      
          public override void Write(byte[] buffer, int offset, int count)
          {
              this.first.Write(buffer, offset, count);
              this.second.Write(buffer, offset, count);
          }
      }
      
      // ...
      
      using (var writerFile = new XmlTextWriter(File.Create(@"c:\test.xml")))
      using (var writer = new XmlTextWriter(
            new DualStream(Response.OutputStream, writerFile)), null))
      {
           // use writer
      }
      
        2
  •  1
  •   Tim Cooper    13 年前

    您需要将memoryStream位置重置为0。

    即。:

    Memory.Position = 0
    
        3
  •  0
  •   David Espart    15 年前

    你试过保存方法了吗?

    http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.save%28VS.71%29.aspx

    我不知道你是否能在你的语境中使用它。

        4
  •  0
  •   AakashM    15 年前

    我发现 this EchoStream class on codeproject 通过谷歌搜索 .net stream tee (tee是你想要的unix-y单词)。