1

メソッドに渡される HtmlTextWriter オブジェクト (theWriter) があります。この方法は中間層にあります。theWriter の内容をデバッグモードで読みたいです。メソッドは次のとおりです。

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

Panel:WebControl から継承します。

私はもう試した

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

しかし、それはオブジェクトタイプ「System.Web.HttpWriter」のみを出力します。Response オブジェクトでメソッドを使用する例をいくつか見てきました。しかし、私はこのレイヤーのレスポンスにアクセスできません。何か案は?

4

1 に答える 1

2

InnerWriterTextWriterストリームに書き込む 派生クラスです。そのストリームを開いて、そこからデータを読み取る必要があります。そのストリームを開いて読み取ることができるかどうかは未解決の問題であり、ストリームの種類に大きく依存します。

あなたの例を使用するに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

したがって、一般的に、問題に対する他の解決策を探すことをお勧めします。根底にあるストリームが何であるか、そしてそれを読むことができることを確実に知っていない限り...そして、物事が予期せず変化することはありません.

于 2013-04-15T21:53:09.420 に答える