我问这个问题主要是因为我没有明确的想法。我相信我了解网络服务器的工作原理,但由于某种原因,我得到的结果与预期不同。
所以基本上我想用代码复制我用真正的网络浏览器所做的事情。
我有一个名为 Fiddler 的程序,它充当代理,以查看来自 Web 服务器的所有请求和响应。
1.所以当我打开我的兄弟然后转到http://10.10.10.28/tfs:8080
这就是显示的内容:
--------
. . . . 这就是提琴手记录的内容:
当我单击取消或尝试登录时,将发出其他请求,提琴手将记录更多数据。我不在乎这个权利,我只对模拟第一个请求感兴趣。
无论如何,提琴手告诉我们标题是:
GET http://10.10.10.28/tfs:8080 HTTP/1.1
Host: 10.10.10.28
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
回应是:
HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 12.0.0.6421
Date: Fri, 24 Aug 2012 14:36:22 GMT
Content-Length: 0
Proxy-Support: Session-Based-Authentication
2. 终于到了有趣的代码部分现在我想发送相同的标头并期望得到相同的响应。由于某种原因,我得到了不同的回应!
public static void Main(string[] args)
{
// I save the header bytes recorded from fiddler on a file to make sure I am sending the exact same request
byte[] header = System.IO.File.ReadAllBytes(@"C:\Users\Antonio\Desktop\header");
// create the client
TcpClient client = new TcpClient("10.10.10.28", 8080);
// get the stream so that we can read and write to it
var stream = client.GetStream();
// now that we have the stream wait for the server to respond
WaitForResponse(stream); // waits on a separate thread
// send the request to the header
stream.Write(header, 0, header.Length);
// wait
Console.Read();
}
public static void WaitForResponse(NetworkStream stream)
{
Task.Factory.StartNew(() => {
byte[] buffer = new byte[16384];
int responseLength = stream.Read(buffer, 0, buffer.Length);
string resp = System.Text.UTF8Encoding.UTF8.GetString(buffer, 0, responseLength);
resp = resp; // place breakpoint
});
System.Threading.Thread.Sleep(10); // make sure task starts
}
这是我得到的回应:
为什么我得到不同的响应?我相信 Web 服务器使用 tcp 连接将页面发送到客户端。为什么我采用的这种方法不起作用?另外,当我从代码向网络服务器发送请求时,为什么提琴手没有记录任何内容?谷歌浏览器如何连接到网络服务器?我敢打赌,chrome 浏览器也正在与 Web 服务器建立 tcp 连接。