Как просмотреть содержимое HTMLTextWriter?

У меня есть объект HtmlTextWriter (theWriter), который передается в метод. Этот метод находится на среднем уровне. Я хотел бы прочитать содержимое theWriter в режиме отладки. Метод:

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

который наследуется от Panel:WebControl.

я пытался

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

но это выводит только тип объекта: «System.Web.HttpWriter». Я видел, как в некоторых примерах используются методы объекта Response. Но у меня нет доступа к ответу на этом уровне. Любые идеи?


person 4thSpace    schedule 15.04.2013    source источник


Ответы (1)


InnerWriter — это производный от TextWriter класс, который записывает данные в поток. Вам нужно будет открыть этот поток и прочитать данные из него. Вопрос о том, можете ли вы открывать и читать из этого потока, остается открытым и во многом зависит от типа потока.

Итак, чтобы использовать ваш пример, 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, но и от потока, в который пишет TextWriter.

Например, HtmlTextWriter может записывать в StreamWriter, который подключен к BufferedStream, подключенному к GZipStream, который, наконец, записывает в MemoryStream.

Так что, в общем, я бы порекомендовал вам поискать какое-то другое решение вашей проблемы. Если вы точно не знаете, что такое основной поток, и что вы можете его прочитать ... и что ничего не изменится для вас неожиданно.

person Jim Mischel    schedule 15.04.2013
comment
кроме того, если вы читаете поток (в режиме отладки), вам, возможно, придется сбросить позицию потока, чтобы его можно было использовать позже в программе (даже чтение в режиме отладки действует так же, как если бы вы читали его в реальной жизни (это в реальной жизни)) - person Paul Sullivan; 16.04.2013
comment
Можете ли вы привести пример того, как это можно открыть и прочитать в режиме отладки? - person 4thSpace; 16.04.2013