当前位置:编程学习 > C#/ASP.NET >>

C#获取打开网站时候发送的请求包

工作中遇到一个问题,请各位高手帮忙看看,谢谢!


打开一个网站的时候需要发送一个请求包的,

已知这个网站地址,请问我该如何获取这个请求包!越简单越好!用C#语言来编写这个程序!

WebBrowser控件里面有没有获取请求包内容的方法,或者是HttpWebRequest WebRequest里面有没有方法,

谢谢!
请各位高手指点!在线等! --------------------编程问答-------------------- 可以用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);
}


--------------------编程问答-------------------- 楼上的思路好像很好,学习了。不过这个写法似乎有问题:

       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  --------------------编程问答-------------------- 确实是死循环,这仅是一小段示例代码,它被设计成一个monitor,只要有HTTP的GET或POST请求(在IE里访问网站时),就会在屏幕上显示一段数据内容。
因为不清楚楼主需要这个功能的目的是什么,所以楼主应该要根据自己的需要来修改这段代码,比如过滤特定的网址,对数据报进行分析等等。
注意本机请求(http://localhost)是捕捉不到的,还有如果要实现真正的网络通信监视器,应当用c/c++来写,C#托管代码会对网络性能造成影响,另外HTTP代理方式实现http监视器是更有针对性、对系统性能影响更小的方式。

通常情况下用第一种方法(ShDocVw.BeforeNavigate事件)就可以取到足够的信息了,包括http header和post data等,这种方式也更简单,而且也可以按http协议的规范,基本上推断出数据报的内容,而没有必要监听捕捉完整的数据报。
--------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,