代码之家  ›  专栏  ›  技术社区  ›  Jeff

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

  •  6
  • Jeff  · 技术社区  · 16 年前

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

    (上下文,我正在为我正在教的一门网络编程课编写一些代码。我希望我的学生了解HTTP“黑匣子”中发生的基本情况。)

    5 回复  |  直到 16 年前
        1
  •  21
  •   Darin Dimitrov    16 年前

    要真正理解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());
        }
    }
    

    另一种可能性是 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重定向。

        2
  •  4
  •   Oded    16 年前

    使用 WebRequest WebResponse 课程,视需要而定。

    TcpClient .

        3
  •  3
  •   Wim    16 年前

    System.Net.Sockets.TcpClient 如果您想编写自己的低级客户端。对于HTTP GET和POST,您可以使用 HttpWebRequest HttpWebResponse 不过是上课。

    TcpClient Socket ,请参阅 Socket class .

        4
  •  2
  •   Community Mohan Dere    9 年前

    在我对这篇文章的回应中 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(); 
      }
    }
    
        5
  •  1
  •   nos    16 年前

    使用 WFetch 为了示威。

    HttpWebRequest 让您可以对请求进行相当多的控制-如果是为了演示,我会再次使用 Wireshark

    推荐文章