HttpWebRequest 二三事

转载 2015年11月18日 14:32:09

转自:http://www.cnblogs.com/1971ruru/archive/2012/04/11/2442589.html


随着REST风格的流行,直接通过 HttpWebRequest 进行服务调用的客户端应用越来越多。这里总结一些可能需要费时调查的经验,希望能帮助大家。

1. 用完的HttpWebRequest要Abort()或者要把 Response.Close()
否则会导致请求Timeout。 (HttpWebRequest.Method默认是GET)

  1. static void Main( string [] args)
  2. {
  3. for ( int i = 0; i < 10; i++)
  4. {
  5. Console.Write( "[{0}] Request - " , i + 1);
  6. TryGet( "https://login.live.com/" );
  7. }
  8. Console.Read();
  9. }
  10. static void TryGet( object obj)
  11. {
  12. try
  13. {
  14. HttpWebRequest webReq = null ;
  15. string url = ( string )obj;
  16. webReq = (HttpWebRequest)HttpWebRequest.Create(url);
  17. webReq.Timeout = 20 * 1000;
  18. var resp = webReq.GetResponse() as HttpWebResponse;
  19. resp.Close();
  20. Console.WriteLine( "Get Response StatusCode: {0}({1})" ,
  21. resp.StatusCode, ( int )resp.StatusCode);
  22. }
  23. catch (WebException we)
  24. {
  25. Console.WriteLine( "Get Response StatusCode: {0}({1})" ,
  26. we.Status, ( int )we.Status);
  27. }
  28. catch (Exception ex)
  29. {
  30. Console.WriteLine(ex);
  31. }
  32. }


上面的代码,会从第3次Request开始出现Timeout,因为GetResponse 后 Stream打开未关闭。

解决方法:上面的代码中加上 resp.Close(); 或者 webReq.Abort(); 就能解决。

2. 多线程中调用 HttpWebRequest 时,需要设置 ServicePointManager.DefaultConnectionLimit 数(默认连接数是 2)。
当多线程请求时,同时的连接数超过Limit时,GetResponse会抛出 Timeout WebException。

  1. // 用多线程同时发出4个请求
  2. WaitCallback methodTarget = new WaitCallback(TryGet);
  3. ThreadPool.QueueUserWorkItem(methodTarget, "https://login.live.com/" );
  4. ThreadPool.QueueUserWorkItem(methodTarget, "https://login.live.com/" );
  5. ThreadPool.QueueUserWorkItem(methodTarget, "https://login.live.com/" );
  6. ThreadPool.QueueUserWorkItem(methodTarget, "https://login.live.com/" );

解决方法:在GetResponse()之前设置 ServicePointManager.DefaultConnectionLimit = 100;

3. 当请求一个基于SSL的服务时,默认的验证行为都在 ServicePointManager 定义:
ServicePointManager.CheckCertificateRevocationList = true;

如果请求的服务端证书没有第三方的认证支持,则请求会失败,如果要完全信任服务端证书,则可以将
CheckCertificateRevocationList 设为 false。

4. 可以在 <system.net> 配置节中配置 HttpWebRequest 的属性,包括 WebProxy

  1. <system.net>
  2. <connectionManagement>
  3. </connectionManagement>
  4. <defaultProxy>
  5. <proxy proxyaddress= "http://xxx.xxx.xxx.xxx:xxx" bypassonlocal= "False" />
  6. </defaultProxy>
  7. <settings>
  8. <httpWebRequest useUnsafeHeaderParsing= "true" />
  9. <servicePointManager checkCertificateName= "true"
  10. checkCertificateRevocationList= "true"
  11. enableDnsRoundRobin= "true"
  12. expect100Continue= "true"
  13. useNagleAlgorithm= "true" />
  14. </settings>
  15. </system.net>  

HttpWebRequest 二三事

随着REST风格的流行,直接通过 HttpWebRequest 进行服务调用的客户端应用越来越多。这里总结一些可能需要费时调查的经验,希望能帮助大家。...

百度外卖敏捷测试理解二三事

  • 2017年06月20日 19:40
  • 10.73MB
  • 下载

C# HttpWebRequest三件需要注意的事

使用微软的.Net框架的时候很可能会接触到HttWebRequest。使用者在使用的时候有时候会发现这种现象即有时候使用多线程下载速度会变的非常的慢,特别是如果使用多线程去获取响应头部时候。这时候Ht...

WinForm二三事

  • 2012年06月05日 20:39
  • 484KB
  • 下载

程序猿二三事之工具使用-Eclipse常用快捷键

快捷键快捷键建议在日常开发中尽量多使用,可以大大提高编写代码效率。 多用,快捷键都不用记,会成为手指习惯,用鼠标的场景也会相当少,鼠标用多了手指会酸痛的。 以下是一些常用快捷键的介绍: 注:ctrl...

关于傅立叶变换的二三事

  • 2011年09月02日 14:50
  • 451KB
  • 下载

我与日志记录二三事(log4j&logback)

随着时间的流逝,转眼间已经工作了一年有余。这一年的工作让我的开发观念从学生彻底的变成了一个真正的开发人员。很简单的就是这个关于日志的问题,以前自己也写过一些项目,从没想过使用日志来记录程序的运行,可以...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HttpWebRequest 二三事
举报原因:
原因补充:

(最多只允许输入30个字)