HttpWebRequest Timeout

网友投稿 746 2022-11-24

HttpWebRequest Timeout

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( "); } 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, "); ThreadPool.QueueUserWorkItem(methodTarget, "); ThreadPool.QueueUserWorkItem(methodTarget, "); ThreadPool.QueueUserWorkItem(methodTarget, ");

解决方法:在GetResponse()之前设置 ServicePointManager.DefaultConnectionLimit = 100; 3.  当请求一个基于SSL的服务时,默认的验证行为都在 ServicePointManager 定义: ServicePointManager.CheckCertificateRevocationList = true;

如果请求的服务端证书没有第三方的认证支持,则请求会失败,如果要完全信任服务端证书,则可以将 CheckCertificateRevocationList  设为 false。 4. 可以在 配置节中配置 HttpWebRequest 的属性,包括 WebProxy

龙腾一族至尊龙骑

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( "); } 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, "); ThreadPool.QueueUserWorkItem(methodTarget, "); ThreadPool.QueueUserWorkItem(methodTarget, "); ThreadPool.QueueUserWorkItem(methodTarget, ");

解决方法:在GetResponse()之前设置 ServicePointManager.DefaultConnectionLimit = 100; 3.  当请求一个基于SSL的服务时,默认的验证行为都在 ServicePointManager 定义: ServicePointManager.CheckCertificateRevocationList = true;

如果请求的服务端证书没有第三方的认证支持,则请求会失败,如果要完全信任服务端证书,则可以将 CheckCertificateRevocationList  设为 false。 4. 可以在 配置节中配置 HttpWebRequest 的属性,包括 WebProxy

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C#操作摄像头 实现拍照功能
下一篇:RabbitMQ使用交换机处理异步消息队列------分布式事务处理案例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~