项目转战页游(?),需要在首包开始游戏后,背景下载后续的资源。这个模块是用httpwebrequest实现的,也考虑过webClient,据说webclient没法显示进度和错误码(主程说的,其实好像也是有的)。那就用httpwebrequest的。采用异步下载,例子参考至msdn,连接如下:https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse(v=vs.110).aspx

实际项目中未使用ManualResetEvent。实际测试结果会遇到问题,经常在endGetResponse吃,报错,捕获webexception,status=receiveFailture。google后,发现相关的解决方案比较少。反而msdn针对各种status有相关解决推荐。连接如下:https://docs.microsoft.com/en-us/dotnet/framework/network-programming/understanding-webrequest-problems-and-exceptions。

通过解决推荐,了解到默认http的默认连接数是2,首先这个http连接数本身很少,可以通过设置DefaultConnectionLimit将连接数调大点。往往,假设connection不正常的关闭,会导致connection不会被释放,从而导致连接数被占用。仔细查代码,发现了喜感的事:

    private long GetLength(string url){HttpWebRequest _request = WebRequest.Create(url) as HttpWebRequest;_request.Method = "HEAD";HttpWebResponse _response = _request.GetResponse() as HttpWebResponse;long _ret = _response.ContentLength;_response.Close();//这里是新加的,切记response必须要关闭。return _ret;}

这里用上述同步方法获得url对应的资源的大小,用于显示加载的进度。忘记关闭,就会导致connection被占用,释放不了。然后产生receive Failture。最后,在endResponse在获得资源的大小即可。综上,切记getResponse或者endGetResponse,同步、异步方法后都要记得调用response.close方法。

将默认连接数改大,同时修正上述时,发现不会在大批量的出现receive failture了。但是偶尔还会有资源下载失败的情况。这时候根据msdn推荐,进行了如下设置:

            //创建一个初始化请求对象  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));request.KeepAlive = false;//这个有用request.Proxy = WebRequest.DefaultWebProxy;//不使用代理,减少自动搜索代理的过程,提升性能//设置下载相关参数  requestState.RetryTime = 4;//增加下载失败重试次数requestState.StateObject = this;

同时,在捕获到一些status时,重新尝试下载几次。基本上就解决了资源下载不下来的问题。

    private bool IsRetryable(WebException ex){returnex.Status == WebExceptionStatus.ReceiveFailure ||ex.Status == WebExceptionStatus.ConnectFailure ||ex.Status == WebExceptionStatus.KeepAliveFailure;}
   catch (WebException e){if (e.Status == WebExceptionStatus.RequestCanceled)return;Debug.LogErrorFormat("\nRespCallback Exception raised!");Debug.LogErrorFormat("\nMessage:{0}", e.Message);Debug.LogErrorFormat("\nStatus:{0}", e.Status);Debug.LogErrorFormat("请求资源响应失败,资源url{0}", m_RequestState.Url);Connection.pool.log("ResponseCallback资源异常 WebException StackTrace :{0}, Message:{1}, Status:{2}, 资源url:{3}。", e.StackTrace, e.Message, e.Status, m_RequestState.Url);if (IsRetryable(e)){TryRequest(requestState);System.Threading.Thread.Sleep(2);//当前下载线程休息2ms}else{int _stateCode = 0;if (requestState.Response != null)_stateCode = (int)requestState.Response.StatusCode;Connection.pool.log("下载资源异常Response Code :{0}, Message:{1}, 资源url:{2}。", _stateCode, e.Message, m_RequestState.Url);m_IsSuccess = true;requestState.StateObject.DownLoadCompleted();return;}//m_IsSuccess = false;//requestState.StateObject.DownLoadCompleted();}

注:404错误要忽略哦。
参考:

 http://www.cnblogs.com/summer_adai/archive/2013/04/26/3045253.html

httpwebrequest下载文件失败的解决方案相关推荐

  1. HttpWebRequest下载文件,乱码问题解决方案

    写在前面 今天之所以会总结HttpWebRequest下载文件,主要是因为在使用该类下载文件的时候,有些地方需要注意一下,在实际的项目中遇到过这种问题,觉得还是有必要总结一下的.在下载文件时,最常见的 ...

  2. nginx反向代理下载文件失败处理

    最近遇到了客户在从我们的服务器下载文件失败时的情况.然后把解决方案一并整理一下以备后续.需要说明的是,我们前端都是使用nginx来做反向代理,后面的逻辑处理采用php的方式. 1.缓存目录不可写 ng ...

  3. FileZilla下载文件失败 local: unable to open C:/xxx/xxx

    FileZilla下载文件失败 local: unable to open C:/xxx/xxx FileZilla ftp工具,使用FileZilla从服务器上下载文件的时候总是提示:错误: loc ...

  4. 百度网盘下载文件失败解决办法??

    百度网盘下载KMS10.exe下载文件失败, 把系统自带的杀毒软件干掉 windows10为例,设置-更新和安全-----windows安全中心-病毒和危险防护 ----病毒和危险防护设置" ...

  5. ftp下载文件失败问题记录

    1.使用ftp命令以及wget下载ftp文件,都失败了. 1)ftp命令下载文件失败提示 ftp: connect: Connection refused 2)wget命令下载文件失败提示 ==> ...

  6. 阿里云OSS上传请求403问题的完美解决方案及uni.uploadFile h5上传文件失败完美解决方案

    在使用阿里云OSS服务时,会用到跨域AJAX上传,上传时报403错误,之前遇到过此类问题并成功解决了,但时间长了遗忘,因此记录下来以备后续学习了解ajax跨域上传OSS. ajax跨域上传首先会发送o ...

  7. nginx(二十八)nginx下载文件失败

    一    缓冲区基础知识铺垫 ①    proxy_temp_path '1'表示层级1的目录名为1个数字(0-9);'2'表示层级2目录名为2个数字(00-99) +++++++++++'遗留问题' ...

  8. MinGW-w64下载文件失败the file has been downloaded incorrectly

    文章目录 前言 (必读) 1 问题背景 2 报错原因 3 解决方案 前言 (必读) 笔者强烈推荐使用 linux平台 搭建C++环境所需的东西,如果是用windows平台,则会出现很多小问题,或者即使 ...

  9. QQ2012安装不了怎么办?“提取安装文件失败”的解决方案

    安装qq2012时提示"提取安装文件失败"该怎么办?在本篇教程中将为你介绍这个问题的解决方案! 安装过程中没有问题,把电脑上原来的版本也卸载了,到最后一步安装新版本,QQ2012的 ...

最新文章

  1. KnifeCMSV1.0Beta测试版发布
  2. [Delphi] Webbroker ISAPI 示例说明
  3. JDK注解(内置和自定义)
  4. 头上有多少根头发算秃头?
  5. 计算机入门的一些常用小技巧总结
  6. c语言补全程序,跪求高手解答简单的程序补全题~!
  7. java 算法比较,java几种面消隐算法的比较
  8. Atitit.atiDataStoreService   v2 新特性
  9. php网站模板怎么改动,ECshop网站模板修改详细教程 and 模板对应的文件
  10. Spring Cloud Gray 微服务灰度中间件
  11. ntds(600)ntdsa:系统错误1453配额不足及恢复过程记录
  12. HinM_COMPILER_cale计划和实现
  13. 关于debug时的断点无效问题 [已解决,不知原因]
  14. Zookeeper源码之集群选举
  15. 2016亚洲城市GDP50强出炉
  16. 如何用Jmeter发送消息到Solace JNDI
  17. 检查计算机电源,台式机电源如何检测 电脑电源检测方法【详解】
  18. Upload-Labs靶场 1-21全通关教程
  19. iOS13正式版来了,付刷机方法教程,苹果关闭iOS12.4验证通道
  20. 【理科】2020年高考数学(第八章 立体几何)考点与题型全归纳

热门文章

  1. 欢迎大家加入我的Q群
  2. python画图皮卡丘_用python画一只可爱的皮卡丘
  3. codeforces1438C Engineer Artem (#682 Div2)
  4. apidoc 自动化生成 api接口文档
  5. 游戏编辑器制作(7)
  6. OFFICE、EXCEL、WORD、PPT操作技巧个人笔记本(持续更新)
  7. 计算机组成原理大题速成,计算机组成原理大题
  8. 【图形学数学基础】第一章
  9. win10启用或关闭windows功能空白终极解决办法
  10. 电脑软件商店哪个好用