关闭

HttpWebRequest 二三事

382人阅读 评论(0) 收藏 举报

转自: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>  

0
0
查看评论

用HttpWebRequest请求时,获取响应的状态码

直接上一段代码 [TestMethod] public void TestWebPage() { var httpStatusCode = 200; try { var req = WebRequest.Create( "http://10.168.94.116/Default...
  • Linux7985
  • Linux7985
  • 2012-08-17 21:21
  • 36808

利用HttpWebRequest通过POST Json数据在.net后台实现不同平台间的数据传输

/// /// 返回JSon数据 /// /// 要处理的JSON数据 /// 要提交的URL /// 返回的JSON处理字符串 public string GetResponseData(string JSO...
  • uniqer
  • uniqer
  • 2013-11-15 16:46
  • 32164

C# 使用HttpWebRequest Post提交数据,携带Cookie和相关参数示例

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Configuration; using ...
  • smartsmile2012
  • smartsmile2012
  • 2017-05-08 17:33
  • 7137

OJ--童年生活二三事

问题及代码: /* *Copyright(c) 2014 烟台大学计算机学院 *All rights reserved. *文件名称:test.cpp *作者:尚 月 *完成日期:2014年 12 月 03 日 *版本号:V1.0 * *问题描述: 计算从0个台阶到N个台阶的走法 ...
  • shangyue025
  • shangyue025
  • 2014-12-03 17:27
  • 1221

zzuli OJ 1091: 童年生活二三事(多实例测试)

Description Redraiment小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。  但年幼的他一次只能走上一阶或者一下子蹦上两阶。  现在一共有N阶台阶,请你计算一下Redraiment从第0阶到第N阶共有几种走法。 Input 输入包括多组数...
  • sinat_25926481
  • sinat_25926481
  • 2015-09-04 10:23
  • 4006

C# HttpWebRequest第一次请求很慢超时的原因

在使用HttpWebRequest建立http请求时,第一次连接的响应速度会很慢,而且还会出现请求超时的错误,这里大概有十几秒钟的等待时间,但是一旦第一次运行成功后,下面的请求页面速度就会很快了。 我发现的两种解决方法: 1.IE浏览器设置  打开IE浏览器---》工具---》I...
  • hatchgavin
  • hatchgavin
  • 2016-08-10 16:43
  • 2120

在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全部采用手工操作工作量大而且繁琐,因此周公决定利用C#来实现。在很多地方都需要验证用户身份才可以进行下一步操作,这就免不了POST请求来登录,在实际过程中发现有些网站登录是HTTPS形式的,在解...
  • zhoufoxcn
  • zhoufoxcn
  • 2011-05-08 22:51
  • 90060

HttpWebRequest 二三事

 http://www.cnblogs.com/Thriving-Country/archive/2011/09/18/2180143.html http://www.cnblogs.com/1971ruru/archive/2012/04/11/2442589.html HttpWebR...
  • sdnjiejie65
  • sdnjiejie65
  • 2014-09-21 23:26
  • 313

缓存架构设计细节二三事

本文主要讨论这么几个问题: (1)“缓存与数据库”需求缘起 (2)“淘汰缓存”还是“更新缓存” (3)缓存和数据库的操作时序 (4)缓存和数据库架构简析   一、需求缘起 场景介绍 缓存是一种提高系统读性能的常见技术,对于读多写少的应用场...
  • zhangweikai966
  • zhangweikai966
  • 2016-09-01 11:22
  • 417

C#实现http协议通讯类WebClient

原文地址:http://www.360doc.com/content/13/1218/16/15141473_338175243.shtml CS代码  using System;   using Syste...
  • chanyinhelv
  • chanyinhelv
  • 2013-12-18 16:38
  • 4492
    个人资料
    • 访问:182513次
    • 积分:2409
    • 等级:
    • 排名:第18215名
    • 原创:29篇
    • 转载:218篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论