1

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

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

它继承自 Panel:WebControl。

我试过了

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

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

4

1 回答 1

2

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

因此,使用您的示例,theWriter.InnerWriter是一个派生自TextWriter. 但是你不知道是什么类型,而且TextWriter它本身并没有暴露底层流。

现在,如果InnerWriter是 a StreamWriter,那么您也许可以这样写:

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下次尝试写入它时会抛出一个异常。

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

例如,HtmlTextWriter可能正在写入 a StreamWriter,它连接到BufferedStream连接到 a 的 a GZipStream,最终写入 a MemoryStream

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

于 2013-04-15T21:53:09.420 回答