如何在.Net中手动创建HTTP请求?

时间:2010-01-21 13:57:58

标签: .net http webclient

我想创建自己的自定义HTTP请求。 WebClient类非常酷,但它会自动创建HTTP请求。我想我需要创建一个到Web服务器的网络连接,并通过该流传递我的数据,但我不熟悉支持这种事情的库类。

(上下文,我正在为我正在教授的网络编程课程编写一些代码。我希望我的学生能够理解HTTP“黑匣子”内部发生的事情的基础知识。)

5 个答案:

答案 0 :(得分:17)

要真正了解HTTP协议的内部结构,您可以使用TcpClient class:

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());
    }
}

另一种可能性是activate tracing,将以下内容放入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重定向。

答案 1 :(得分:4)

根据需要使用WebRequestWebResponse类。

如果您需要低于这些提供的级别,请查看其他System.Net.Sockets。*客户端类,例如TcpClient

答案 2 :(得分:3)

如果您想编写自己的低级客户端,请查看System.Net.Sockets.TcpClient。对于HTTP GET和POST,您可以使用HttpWebRequestHttpWebResponse类。

如果你真的是受虐狂,你可以低于TcpClient并实施自己的Socket,请参阅Socket class

答案 3 :(得分:2)

在我对这篇SO帖子SharePoint 2007, how to check if a folder exists in a document library的回复中,我已经介绍了创建HttpWebRequest和阅读响应的基础知识。

编辑:在上面的帖子中添加了一个代码示例

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(); 
  }
}

答案 4 :(得分:1)

使用WFetch进行演示。

至于编程,HttpWebRequest让你可以控制相当多的请求 - 再次,如果它是一个演示,我会使用Wireshark来嗅探当你执行各种任务时发生的事情。 HttpWebRequest