zoukankan      html  css  js  c++  java
  • HttpWebRequest Timeout

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


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

    static   void  Main( string [] args)  
    
    {  
    
    for  ( int  i = 0; i < 10; i++)  
    
        {  
    
            Console.Write( "[{0}] Request - " , i + 1);  
    
            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 = 20 * 1000;  
    
            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#

  • 相关阅读:
    PowerBuilder 前景(转贴)
    利用Lucene.net搭建站内搜索(3)创建索引
    执行力差的五大原因
    js关于document和window对象_javascript教程
    HTML内部链接
    深入理解 __doPostBack (转帖)
    利用Lucene.net搭建站内搜索(4)数据检索
    a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种办法
    Javascript进阶 (转帖)
    windows通过VNC连接linux (Fedora 12)
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/11583916.html
Copyright © 2011-2022 走看看