我有一个HtmlTextWriter对象(theWriter)被传递给一个方法。此方法位于中间层。我想在调试模式下读取theWriter的内容。方法是:
protected override void Render (HtmlTextWriter theWriter) {...}它继承自Panel:WebControl。
我试过了
theWriter.Flush();
theWriter.InnerWriter.ToString();但这只输出对象类型:"System.Web.HttpWriter“。我见过一些在响应对象上使用方法的例子。但是我不能访问这一层的响应。有什么想法吗?
发布于 2013-04-16 05:53:09
InnerWriter是一个TextWriter-derived类,它写入流。您必须打开该流并从中读取数据。您是否可以打开和读取该流是一个悬而未决的问题,这在很大程度上取决于它是什么类型的流。
因此,为了使用您的示例,theWriter.InnerWriter是从TextWriter派生的对象。但是您不知道是哪种类型,而且TextWriter本身并不公开底层流。
现在,如果InnerWriter是一个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将在您下次尝试写入它时抛出异常。
也有可能你将无法读取流。例如,如果基流是一个NetworkStream,你就不能读取它。或者它可以是一个只允许写入的FileStream。没有很好的通用方法可以做到这一点,因为它不仅完全依赖于特定的TextWriter-derived类,而且还依赖于TextWriter写入的流。
例如,HtmlTextWriter可以写入StreamWriter,该BufferedStream连接到连接到GZipStream的GZipStream,最后写入MemoryStream。
所以,总的来说,我建议你寻找其他的解决方案来解决你的问题。除非您确实知道底层流是什么,并且您可以读取它...并且事情不会在你身上意外地改变。
https://stackoverflow.com/questions/16025187
复制相似问题