ASP.NET による HTTP Request のキャプチャー

こんにちは。

ASP.NET を使って、HTTP の Request をキャプチャー (Capture) するコードです。
例えば、Microsoft Azure にホストして Remote Debug することで、どんな要求が渡されているか確認できます。(まあ、ログを取れば良いのですが、たまに必要になるんです。この投稿は公開せず、自分へのメモのために掲載しておきます。)

まず、クラスを追加して、以下の IHttpModule クラスを実装します。

. . .
using System.Text;
. . .

public class MyTrackModule : IHttpModule
{
  public void Init(HttpApplication context)
  {
    context.BeginRequest += context_BeginRequest;
    context.EndRequest += context_EndRequest;
  }

  void context_BeginRequest(object sender, EventArgs e)
  {
    HttpApplication application = (HttpApplication)sender;
    HttpContext context = application.Context;
    string method = context.Request.HttpMethod;
    string url = context.Request.Url.AbsoluteUri;
    string querystring = context.Request.QueryString.ToString();
    StringBuilder headerBuilder = new StringBuilder(); 
    foreach (string key in application.Request.Headers.Keys)
    {
      headerBuilder.Append(key);
      headerBuilder.Append(": ");
      headerBuilder.Append(application.Request.Headers[key]);
      headerBuilder.Append("n");
    }
    string headers = headerBuilder.ToString();
    byte[] bytes = application.Request.BinaryRead(application.Request.ContentLength);
    string body = Encoding.ASCII.GetString(bytes);
    application.Request.InputStream.Position = 0;

    // print (log) : method, url, querystring, headers, body
    . . .

  }

  void context_EndRequest(object sender, EventArgs e)
  {
    // No code
  }

  public void Dispose()
  {
    // No code
  }
}
. . .

あとは、Web.config に下記の通り設定して、この Custom Module を使用するように設定して終了です。

ASP.NET MVC などの場合には、Views フォルダーにも Web.config があるので注意してください。(Views の Web.config も書き換えておきます。)

<?xml version="1.0"?>
<configuration>
  . . .

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="MyTrackModule"
        type="WebApplication1.MyTrackModule" />
    </modules>
    . . .
  </system.webServer>
</configuration>
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s