如何有效地向ASP.NET中的客户端发送大型XML?

时间:2009-03-12 14:13:31

标签: asp.net xml

对于一个实例,我们有一些IHttpHandler。 我们有两个价值: XmlElement xmlResponse - 包含一个非常大的XML。 HttpContext上下文 - 当前的HttpContext。

简单的解决方案:

context.Response.Write(xmlResponse.OwnerDocument.OuterXml);

但是当XML非常大时,我们可以在该行获得OutOfMemoryException。 调用堆栈看起来像:

   at System.String.GetStringForStringBuilder(String value, Int32 startIndex, Int32 length, Int32 capacity)
   at System.Text.StringBuilder.GetNewString(String currentString, Int32 requiredLength)
   at System.Text.StringBuilder.Append(Char value)
   at System.IO.StringWriter.Write(Char value)
   at System.Xml.XmlTextWriter.InternalWriteEndElement(Boolean longFormat)
   at System.Xml.XmlTextWriter.WriteFullEndElement()
   at System.Xml.XmlElement.WriteTo(XmlWriter w)
   at System.Xml.XmlElement.WriteContentTo(XmlWriter w)
   at System.Xml.XmlElement.WriteTo(XmlWriter w)
   at System.Xml.XmlElement.WriteContentTo(XmlWriter w)
   at System.Xml.XmlElement.WriteTo(XmlWriter w)
   at System.Xml.XmlDocument.WriteContentTo(XmlWriter xw)
   at System.Xml.XmlDocument.WriteTo(XmlWriter w)
   at System.Xml.XmlNode.get_OuterXml()

我会写一些这样的代码:

HttpWriter writer = new HttpWriter(context.Response);
XmlTextWriter xmlWriter = new XmlTextWriter(writer);
xmlResponse.OwnerDocument.WriteTo(xmlWriter);

但问题是HttpWriter的构造函数是内部的! HttpContext在Write方法中内部使用HttpWriter。

workarrounds存在什么(除了通过反射创建HttpWriter)?

3 个答案:

答案 0 :(得分:3)

我会直接流到response.OutputStream

XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, 
System.Text.Encoding.UTF8);  

答案 1 :(得分:1)

xmlResponse.OwnerDocument.Save(Response.Output);

答案 2 :(得分:0)

您可以通过读取文件几行然后冲洗出来,重复并冲洗来创建缓冲区。这可以让你超越OutOfMemory异常,或者应该。

但如果这些是巨大的XML文件,使用HttpResponse和“写”不是最好的选择。最好创建和链接并允许除.NET Response对象之外的其他内容将文件传递给用户。因此,我会认真考虑重新考虑您正在设计的架构。也许文件传输Web服务可能更好地传输这些大文件?试着发表一些想法。

我在这里遗漏了什么吗?