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

如何在.Net中手动创建HTTP请求?,.net,http,webclient,.net,Http,Webclient,我想创建自己的自定义HTTP请求。WebClient类非常酷,但它会自动创建HTTP请求。我想我需要创建一个到web服务器的网络连接,并通过该流传递数据,但我不熟悉支持这种事情的库类 (上下文,我正在为我正在教授的web编程课程编写一些代码。我希望我的学生了解HTTP“黑盒子”中发生的基本情况。)根据需要使用or类 如果您需要比这些提供的级别低,请查看其他System.Net.Sockets.*客户端类,例如。如果您想编写自己的低级别客户端,请签出。对于HTTPGET和POST,您可以使用和类

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

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

根据需要使用or类

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

如果您想编写自己的低级别客户端,请签出。对于HTTPGET和POST,您可以使用和类


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

在我对这篇文章的回复中,我已经介绍了创建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(); 
  }
}

要真正理解HTTP协议的内部结构,可以使用类:

另一种可能是将以下内容放入
app.config
中,然后仅使用执行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>
最后分析生成的
network.log
文件中的网络流量<代码>网络客户端也将遵循HTTP重定向。

用于演示


至于编程,它可以让你控制很多关于请求的事情——同样,如果是为了演示的话,我会用它来嗅探当你使用HttpWebRequest执行各种任务时发生的事情。web请求的漫长过程。使用TcpClient还需要他理解Http所基于的TELNET协议。@John Saunders:Http不是基于TELNET协议构建的。尽管可以使用telnet客户端连接到web服务器。@Igor:我看你是对的。我一定是把它和FTP混淆了。-1:缺少
使用流阅读器/写入程序的
块和响应。@约翰·桑德斯:我知道“使用”是一种很好的编码模式,但是-在流阅读器上调用close()会关闭底层流并“释放与该阅读器相关的任何系统资源”(有关文档,请参阅MSDN)。因此-如果你认为我在这里偷懒,那你就错了。如果中间的某些东西抛出异常,那么你就是在泄漏。@naivists:特别是在示例代码中,因为有人会复制和粘贴它!总是树立一个好的示例。别担心。很久以前我就知道示例代码总是附带一个“购买软件”标签。我宁愿有一个不完美的例子,也不愿什么都没有。谢谢奈维斯特的时间。+1作为一个例子,我期待着尝试一下。这是一个很好的方式来可视化正在发生的事情。谢谢
<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>
using (var client = new WebClient())
{
    var result = client.DownloadString("http://www.google.com");
}