2013-04-15 44 views
1

我有一個HtmlTextWriter對象(theWriter)被傳入一個方法。該方法位於中間層。我想在調試模式下閱讀TheWriter的內容。方法是:如何查看HTMLTextWriter的內容?

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

它從Panel:WebControl繼承。

我已經試過

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

,但只輸出對象類型: 「System.Web.HttpWriter」。我見過一些例子在Response對象上使用方法。但是我無法訪問此層中的響應。有任何想法嗎?

回答

2

InnerWriter是一個TextWriter衍生類,它寫入流中。您必須打開該流並從中讀取數據。您是否可以打開並閱讀該流是一個懸而未決的問題,並且非常依賴於它的流類型。

因此,要使用您的示例,theWriter.InnerWriter是從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,其被連接到連接到一個GZipStreamBufferedStream,最終寫入到MemoryStream

所以,一般來說,我建議你尋找一些解決方案來解決你的問題。除非您確切知道底層流是什麼,並且您可以閱讀它......並且事情不會意外地改變。

+1

此外,如果您讀取流(在調試模式下),您可能必須重置流位置,以便稍後在程序中使用它(甚至在調試模式下讀取它的行爲就像讀取它的IRL一樣生命)) –

+0

你能給出一個例子,說明如何在調試模式下打開和讀取它? – 4thSpace

+0

@ 4thSpace:查看我更新的答案。 –