【问题标题】:How to view contents of HTMLTextWriter?如何查看 HTMLTextWriter 的内容?
【发布时间】:2013-04-08 03:47:42
【问题描述】:

我有一个 HtmlTextWriter 对象 (theWriter) 被传递到一个方法中。此方法处于中间层。我想在调试模式下阅读 theWriter 的内容。方法是:

protected override void Render (HtmlTextWriter theWriter) {...}

继承自 Panel:WebControl。

我试过了

theWriter.Flush();
theWriter.InnerWriter.ToString();

但这仅输出对象类型:“System.Web.HttpWriter”。我已经看到一些示例在 Response 对象上使用方法。但我无权访问这一层的 Response 。有什么想法吗?

【问题讨论】:

    标签: asp.net c#-4.0 htmltextwriter


    【解决方案1】:

    InnerWriter 是一个TextWriter 派生类,用于写入流。您必须打开该流并从中读取数据。您是否可以打开该流并从中读取是一个悬而未决的问题,很大程度上取决于它是什么类型的流。

    因此,以您的示例为例,theWriter.InnerWriter 是从TextWriter 派生的对象。但是你不知道是什么类型,TextWriter 本身并没有暴露底层流。

    现在,如果InnerWriterStreamWriter,那么你也许可以这样写:

    var sWriter = theWriter.InnerWriter as StreamWriter;
    var stream = sWriter.BaseStream;
    var savePosition = stream.Position;
    stream.Position = 0;
    // now, you can read the stream
    // when you're done reading the stream, be sure to reset its position
    stream.Position = savePosition;
    

    不过,你必须非常小心。如果您获得基本流,然后使用StreamReader 打开它,则关闭StreamReader 将关闭基础流。那么您的HtmlTextWriter 将在您下次尝试写入时抛出异常。

    您也可能无法读取该流。例如,如果基本流是NetworkStream,则您无法读取它。或者它可能是一个只供写入的FileStream。没有好的通用方法可以做到这一点,因为它不仅完全取决于特定的TextWriter 派生类,还取决于TextWriter 正在写入的流。

    例如,HtmlTextWriter 可能正在写入 StreamWriter,该 BufferedStream 连接到 GZipStream,后者最终写入 MemoryStream

    因此,总的来说,我建议您寻找其他解决方案来解决您的问题。除非您确定底层流是什么,并且您可以阅读它......并且事情不会意外地改变。

    【讨论】:

    • 另外,如果您读取流(在调试模式下),您可能必须重置流位置,以便稍后在程序中使用(即使在调试模式下读取它就像您读取它一样IRL(这是现实生活中的))
    • 你能举例说明如何在调试模式下打开和阅读它吗?
    最近更新 更多