使用异步套接字客户端进行原始HTTP解析

时间:2011-05-03 19:39:26

标签: c# http .net-3.5 http-headers

我发现another question要求提供相同类型的功能,但问题已超过2年,所以我想知道从那以后有没有人见过。

我基本上使用标准.NET套接字编写了自己的asynchronous http/socket client。我维护了一个1024个套接字的池,我有128个“服务”线程,使用套接字池从互联网上下载网页的速度高达每秒371页(今天只在亚马逊的EC2服务器上进行了测试)。我还创建了另一个异步HTTP客户端,它使用HttpWebRequest来异步下载网页,但它的速度非常慢:我的吞吐量平均每秒约50页(也在亚马逊的EC2上测试)使用相同的设置:1024 pooled { {1}}和128个“服务”线程。

当然,提供HTTP协议支持将占用更多的处理能力和内存。我希望通过亚马逊的超大型EC2服务器,我不会受到处理能力/内存的限制,而只受网络带宽的限制(到目前为止一直如此)。

我正在使用的机器的一个例子是亚马逊的高CPU超大型实例:

  
      
  • 7 GB内存
  •   
  • 20个EC2计算单位(8个虚核,每个计算单位2.5 EC2)
  •   
  • 1690 GB的实例存储
  •   
  • 64位平台
  •   
  • I / O性能:高
  •   
  • API名称:c1.xlarge
  •   

我可以编写自己的HTTP处理,它符合HTTP协议,但如果有一个快速而强大的现成解决方案,它将为我节省大量的工作,痛苦和痛苦。

我至少需要以下功能:

  • 构建HTTP HEAD / GET(可能是POST)请求
  • 从二进制流解析HTTP响应
  • 支持cookies
  • LGP许可证(LGPL)

有人知道任何此类解决方案吗?

1 个答案:

答案 0 :(得分:3)

我不知道HttpWebRequest内部如何使用套接字。打开/关闭套接字可能会受到很大的打击。 WebClient使用keep-alive可能会更好。

编辑:我做了一些谷歌搜索,我不接受这个作为答案。 WebClient似乎是HttpWebRequest / Response的包装器:http://www.codeproject.com/Articles/156610/WP7-WebClient-vs-HttpWebRequest.aspx?msg=3775084

更新

由于你已经开始使用套接字,我会坚持使用它们。随意从我的网络服务器项目中获取内容:http://webserver.codeplex.com

我的解析器:

http://webserver.codeplex.com/SourceControl/changeset/view/56552#671689