2009-09-04 14 views
9

私は具体的に何をしようとしています:HttpModuleから応答htmlを取得するにはどうすればよいですか?

私はいくつかのサイト固有の追跡を行うためにHttpModuleを書いています。私たちのサイトの古い.aspxページには実際のコントロールがない状態でハードコードされていますが、それらは.aspxファイルなので、私のモジュールは要求されたときに実行されます。

私のモジュールのハンドラがPostRequestHandlerExecuteに添付されているので、リクエスタに返されるものはすでに決定されているはずです。

タイトルタグにある文字列をすべて抽出できる必要があります。

ので

<title>Chunky Bacon</title> 

場合、最終的なレンダリングされたHTMLで要求者に送信されます。それから私は "Chunky Bacon"が欲しい。

アイデア?

+0

「タグに含まれる文字列を抽出する」とはどういう意味ですか?リクエスターに返信される応答を操作しようとしていますか?あなたがしようとしていることは明確ではありません。 – NerdFury

+0

申し訳ありませんが、私がHTMLブロックをコードブロックに配置しない限り、HTMLタグが表示されないことを忘れました。私はレスポンスを操作する必要はありません。タイトルタグ内の文字列を抽出するだけです。 – spilliton

+0

明確にするために、レスポンスからコンテンツを取得しようとしているのか、コンテンツからタグを解析しようとしていますか? –

答えて

22

楽しいチャレンジ。

ここでは、コードです:

StreamWatcher.cs

public class StreamWatcher : Stream 
    { 
     private Stream _base; 
     private MemoryStream _memoryStream = new MemoryStream(); 

     public StreamWatcher(Stream stream) 
     { 
      _base = stream; 
     } 

     public override void Flush() 
     { 
      _base.Flush(); 
     } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      return _base.Read(buffer, offset, count); 
     } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      _memoryStream.Write(buffer, offset, count); 
      _base.Write(buffer, offset, count); 
     } 

     public override string ToString() 
     { 
      return Encoding.UTF8.GetString(_memoryStream.ToArray()); 
     } 

     #region Rest of the overrides 
     public override bool CanRead 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool CanSeek 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool CanWrite 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void SetLength(long value) 
     { 
      throw new NotImplementedException(); 
     } 

     public override long Length 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override long Position 
     { 
      get 
      { 
       throw new NotImplementedException(); 
      } 
      set 
      { 
       throw new NotImplementedException(); 
      } 
     } 
     #endregion 
    } 

TitleModule.cs

public class TitleModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    private static Regex regex = new Regex(@"(?<=<title>)[\w\s\r\n]*?(?=</title)", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
    private StreamWatcher _watcher; 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += (o, e) => 
     { 
      _watcher = new StreamWatcher(context.Response.Filter); 
      context.Response.Filter = _watcher; 
     }; 


     context.EndRequest += (o, e) => 
     { 
      string value = _watcher.ToString(); 
      Trace.WriteLine(regex.Match(value).Value.Trim()); 
     }; 
    } 
} 
+0

をしたい、おかげでbroseph! 私はまだこれが実行するコードの多くの行がかかる驚いています... – spilliton

+0

優れたソリューション! – gljivar

+0

4.6.1 AFAIKでは、NotImplementedExceptionを発生させるメソッドを実装する必要があります。これを行う最も簡単な方法は、もちろん、すべての呼び出しを_memoryStreamに延期することです。 –

3

あるのHttpResponseフィルタの作成について語っ4GuysFromRolla上の記事がありますが、基本的にpassiの前に応答を処理するストリームそれを最終出力ストリーム(インターセプタ)に渡します。

http://aspnet.4guysfromrolla.com/articles/120308-1.aspx

+0

クールですが、私はこれらのことについてGoogleがソリューションを探しているときに少し読んでいます。それが送信される前に送信されます。私は操作していないので、HTMLへのアクセスが必要なだけなので、これは過度のことだと思ったが、それが唯一の方法ならば... – spilliton

関連する問題