我想创建自己的自定义HTTP请求。WebClient类非常酷,但它会自动创建HTTP请求。我认为我需要创建一个网络连接到Web服务器并通过该流传输我的数据,但我不熟悉支持这种事情的库类。 (背景:我正在为我教授的Web编程课编写一些代码。我希望我的学生了解HTTP“黑盒”内部发生的基础知识。)
要真正理解HTTP协议的内部机制,您可以使用TcpClient类:
using (var client = new TcpClient("www.google.com", 80))
{
using (var stream = client.GetStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
{
writer.AutoFlush = true;
// Send request headers
writer.WriteLine("GET / HTTP/1.1");
writer.WriteLine("Host: www.google.com:80");
writer.WriteLine("Connection: close");
writer.WriteLine();
writer.WriteLine();
// Read the response from server
Console.WriteLine(reader.ReadToEnd());
}
}
另一种可能性是通过将以下内容放入您的app.config
中来激活跟踪,然后只需使用WebClient执行HTTP请求:
<configuration>
<system.diagnostics>
<sources>
<source name="System.Net" tracemode="protocolonly">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
</sources>
<switches>
<add name="System.Net" value="Verbose"/>
</switches>
<sharedListeners>
<add name="System.Net"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="network.log" />
</sharedListeners>
<trace autoflush="true"/>
</system.diagnostics>
</configuration>
然后您可以执行HTTP调用:
using (var client = new WebClient())
{
var result = client.DownloadString("http://www.google.com");
}
network.log
文件中的网络流量。 WebClient
还会跟随 HTTP 重定向。System.Net.Sockets.TcpClient
。对于HTTP GET和POST,您可以使用 HttpWebRequest
和 HttpWebResponse
类。TcpClient
更低,并实现自己的 Socket
,请参阅 Socket类。System.Net.HttpWebRequest oReq;
string sUrl = "http://yoursite/sites/somesite/DocumentLibrary";
oReq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(sUrl);
oReq.Method = "GET";
oReq.Credentials = System.Net.CredentialCache.DefaultCredentials;
oReq.AllowAutoRedirect = true;
//now send the request
using (System.IO.StreamWriter oRequest =
new System.IO.StreamWriter(oReq.GetRequestStream())) {
oRequest.WriteLine();
}
//and read all the response
using (System.Net.HttpWebResponse oResponse = oReq.GetResponse()){
using (System.IO.StreamReader oResponseReader =
new System.IO.StreamReader(oResponse.GetResponseStream())){
string sResponse = oResponseReader.ReadToEnd();
}
}
using
块。 - John Saunders使用WFetch进行演示。
至于编程方面,HttpWebRequest可以让您控制请求的许多内容 - 如果是为了演示,我建议使用Wireshark来嗅探使用HttpWebRequest执行各种任务时传输的数据。