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

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

static   void  Main( string [] args)  

{  

for  ( int  i = ; i < ; i++)  

    {  

        Console.Write( "[{0}] Request - " , i + );  

        TryGet( "https://login.live.com/" );  

    }  

    Console.Read();  

}  

static   void  TryGet( object  obj)  

{  

try   

    {  

        HttpWebRequest webReq =  null ;  

string  url = ( string )obj;  

        webReq = (HttpWebRequest)HttpWebRequest.Create(url);  

        webReq.Timeout =  * ;  

        var resp = webReq.GetResponse()  as  HttpWebResponse;  

        resp.Close();  

        Console.WriteLine( "Get Response StatusCode: {0}({1})" ,   

            resp.StatusCode, ( int )resp.StatusCode);  

    }  

catch  (WebException we)  

    {  

        Console.WriteLine( "Get Response StatusCode: {0}({1})" ,  

            we.Status, ( int )we.Status);  

    }  

catch  (Exception ex)  

    {  

        Console.WriteLine(ex);  

    }  

}  

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

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

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

// 用多线程同时发出4个请求   

WaitCallback methodTarget =  new  WaitCallback(TryGet);  

ThreadPool.QueueUserWorkItem(methodTarget,  "https://login.live.com/" );  

ThreadPool.QueueUserWorkItem(methodTarget,  "https://login.live.com/" );  

ThreadPool.QueueUserWorkItem(methodTarget,  "https://login.live.com/" );  

ThreadPool.QueueUserWorkItem(methodTarget,  "https://login.live.com/" );  

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

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

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

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

<system.net>
<connectionManagement> </connectionManagement> <defaultProxy> <proxy proxyaddress= "http://xxx.xxx.xxx.xxx:xxx" bypassonlocal= "False" /> </defaultProxy> <settings> <httpWebRequest useUnsafeHeaderParsing= "true" /> <servicePointManager checkCertificateName= "true" checkCertificateRevocationList= "true" enableDnsRoundRobin= "true" expect100Continue= "true" useNagleAlgorithm= "true" /> </settings> </system.net>

原文链接:https://www.cnblogs.com/1971ruru/archive/2012/04/11/2442589.html?tdsourcetag=s_pctim_aiomsg#

HttpWebRequest Timeout的更多相关文章

  1. HttpWebRequest的Timeout和ReadWriteTimeout

    HttpWebRequest.Timeout在发起请求开始,如果未从远程请求的URL得到任何数据的情况下,超过Timeout后,触发超时异常 HttpWebRequest.ReadWriteTimeo ...

  2. HttpWebRequest的timeout和ReadWriteTimeout(转载)

    公司[1]一牛人看我的代码,说我设置的timeout有误,还应该设置ReadWriteTimeout.本人很不服,于是上网查看了相关说明. HttpWebRequest httpWebRequest ...

  3. 通过WebClient/HttpWebRequest实现http的post/get方法

    ///<summary>/// 通过WebClient类Post数据到远程地址,需要Basic认证: /// 调用端自己处理异常 ///</summary>///<par ...

  4. C# post请求 HttpWebRequest

    //body是要传递的参数,格式"roleId=1&uid=2" //post的cotentType填写: //"application/x-www-form-u ...

  5. HttpWebRequest和WebClient的区别

     HttpWebRequest和WebClient的区别(From Linzheng): 1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Creat ...

  6. HttpWebRequest 请求带OAuth2 授权的webapi

    OAuth 2.0注意事项: 1. 获取access_token时,请使用POST private static string GetAuthorization(string username, st ...

  7. C#中HttpWebRequest的用法详解

    原文链接:http://www.cnblogs.com/love201314/p/5029312.html 1.HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数 ...

  8. HttpWebRequest.ReadWriteTimeout 属性

    获取或设置写入或读取流时的超时. 属性值在写入超时或读取超时之前的毫秒数.默认值为 300,000 毫秒(5 分钟). 备注 在写入由 GetRequestStream 方法返回的流时,或在读取由 G ...

  9. C#中HttpWebRequest的用法详解(转载)

    1.HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.2.命名空间:System.Net3.HttpWebRequest对象不是利用new关键字创建 ...

随机推荐

  1. (比赛)C - 小Q系列故事——最佳裁判(水题)

    C - 小Q系列故事——最佳裁判 Time Limit:200MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

  2. Python学习日记(十四) 正则表达式和re模块

    正则表达式: 它是字符串的一种匹配模式,用来处理字符串,可以极大地减轻处理一些复杂字符串的代码量 字符组:它是在同一位置可能出现的各种字符组成了一个字符组,用[]表示,但是它的结果只能是一个数字或者一 ...

  3. ubuntu-网络配置文件

    vim   /etc/NetworkManager/system-connections/Wired connectione 1 

  4. Mysql5.7降级到5.6遇到的坑

    任何版本的升级或降级都存在兼容的问题,DB更为明显,废话不多说,直接进入主题,问题描述如下: Specified key was too long; max key length is 767 byt ...

  5. Altium designer 如何将2D PCB转换成3D

    点击键盘数字键的3,即可,2键可以切换回2D效果,但是如果要看元器件的3D效果,那么元器件封装必须带有3D模型才行! 先按3切换到三维界面,然后按住shift不放,按鼠标右键调整视图角度.

  6. 阿里巴巴开源性能监控神器Arthas jvm

    原文:https://www.cnblogs.com/testfan2019/p/11038791.html 如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常 ...

  7. 二维码内嵌LOGO

    package Test; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; imp ...

  8. 结构型模式(一) 适配器模式(Adapter)

    一.动机(Motivation) 在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的. 如何应对这种&q ...

  9. go socket 服务端处理多用户

    package main import ( "fmt" "net" "strings") func main() { listener, e ...

  10. stm32中使用cubemx配置freertos的信号量大小

    在配置freertos的情况下,cubemx会自动计算每个任务.信号,队列和软件定时器的使用堆栈大小,因此要合理规划 信号量默认是88byte 任务根据设定来计算,我默认配置是128,则最终是624b ...