对于一个实例,我们有一些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)?
答案 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服务可能更好地传输这些大文件?试着发表一些想法。
我在这里遗漏了什么吗?