可以用WebBrowser封装的SHDocVw.BeforeNavigate2事件获取发送的http请求信息
http://www.cnblogs.com/changyou/archive/2010/01/09/1643167.html
不过这个事件提供的信息不是完整的数据报,缺少一些内容
可以通过socket监听方式获取完整的请求信息: static void Main(string[] args)
{
byte[] input = BitConverter.GetBytes(1);
byte[] buffer = new byte[4096];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
s.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.xxx"), 0));// 把这个IP换成你机器上的ip地址
s.IOControl(IOControlCode.ReceiveAll, input, null); int bytes = 0;
do
{
bytes = s.Receive(buffer);
if (bytes > 0)
{
                // 把发送信息显示出来,这里只显示了包含GET或POST的数据报,
                // 应当根据你的需要,过滤和显示相关信息,比如POST的数据内容等
string packet = Encoding.UTF8.GetString(buffer, 0, bytes);
Match m = Regex.Match(packet, "(?s)(GET|POST)");
if (m.Success && packet.IndexOf("HTTP/1") != -1) {
Console.WriteLine("------------------------------------");
Console.WriteLine(packet.Substring(m.Index));
}
}
} while (bytes > 0);
}

解决方案 »

  1.   

    楼上的思路好像很好,学习了。不过这个写法似乎有问题:       do
            {
                bytes = s.Receive(buffer);
                if (bytes > 0)
                {
                    // 把发送信息显示出来,这里只显示了包含GET或POST的数据报,
                    // 应当根据你的需要,过滤和显示相关信息,比如POST的数据内容等
                    string packet = Encoding.UTF8.GetString(buffer, 0, bytes);
                    Match m = Regex.Match(packet, "(?s)(GET|POST)");
                    if (m.Success && packet.IndexOf("HTTP/1") != -1) {
                        Console.WriteLine("------------------------------------");
                        Console.WriteLine(packet.Substring(m.Index));
                    }
                }
            } while (bytes > 0);
    因为Receive是阻塞方法,如果没有数据,会一直等待到timeout为止,如果没有设置timeout,好像是无限等待下去。这样bytes就始终大于零,变成了死循环。
    似乎可用Available属性判断一下,再调用Receive,MSDN上是这样建议的:
    http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.available.aspx 
      

  2.   

    确实是死循环,这仅是一小段示例代码,它被设计成一个monitor,只要有HTTP的GET或POST请求(在IE里访问网站时),就会在屏幕上显示一段数据内容。
    因为不清楚楼主需要这个功能的目的是什么,所以楼主应该要根据自己的需要来修改这段代码,比如过滤特定的网址,对数据报进行分析等等。
    注意本机请求(http://localhost)是捕捉不到的,还有如果要实现真正的网络通信监视器,应当用c/c++来写,C#托管代码会对网络性能造成影响,另外HTTP代理方式实现http监视器是更有针对性、对系统性能影响更小的方式。通常情况下用第一种方法(ShDocVw.BeforeNavigate事件)就可以取到足够的信息了,包括http header和post data等,这种方式也更简单,而且也可以按http协议的规范,基本上推断出数据报的内容,而没有必要监听捕捉完整的数据报。