httpwebrequest下载文件失败的解决方案
项目转战页游(?),需要在首包开始游戏后,背景下载后续的资源。这个模块是用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下载文件失败的解决方案相关推荐
- HttpWebRequest下载文件,乱码问题解决方案
写在前面 今天之所以会总结HttpWebRequest下载文件,主要是因为在使用该类下载文件的时候,有些地方需要注意一下,在实际的项目中遇到过这种问题,觉得还是有必要总结一下的.在下载文件时,最常见的 ...
- nginx反向代理下载文件失败处理
最近遇到了客户在从我们的服务器下载文件失败时的情况.然后把解决方案一并整理一下以备后续.需要说明的是,我们前端都是使用nginx来做反向代理,后面的逻辑处理采用php的方式. 1.缓存目录不可写 ng ...
- FileZilla下载文件失败 local: unable to open C:/xxx/xxx
FileZilla下载文件失败 local: unable to open C:/xxx/xxx FileZilla ftp工具,使用FileZilla从服务器上下载文件的时候总是提示:错误: loc ...
- 百度网盘下载文件失败解决办法??
百度网盘下载KMS10.exe下载文件失败, 把系统自带的杀毒软件干掉 windows10为例,设置-更新和安全-----windows安全中心-病毒和危险防护 ----病毒和危险防护设置" ...
- ftp下载文件失败问题记录
1.使用ftp命令以及wget下载ftp文件,都失败了. 1)ftp命令下载文件失败提示 ftp: connect: Connection refused 2)wget命令下载文件失败提示 ==> ...
- 阿里云OSS上传请求403问题的完美解决方案及uni.uploadFile h5上传文件失败完美解决方案
在使用阿里云OSS服务时,会用到跨域AJAX上传,上传时报403错误,之前遇到过此类问题并成功解决了,但时间长了遗忘,因此记录下来以备后续学习了解ajax跨域上传OSS. ajax跨域上传首先会发送o ...
- nginx(二十八)nginx下载文件失败
一 缓冲区基础知识铺垫 ① proxy_temp_path '1'表示层级1的目录名为1个数字(0-9);'2'表示层级2目录名为2个数字(00-99) +++++++++++'遗留问题' ...
- MinGW-w64下载文件失败the file has been downloaded incorrectly
文章目录 前言 (必读) 1 问题背景 2 报错原因 3 解决方案 前言 (必读) 笔者强烈推荐使用 linux平台 搭建C++环境所需的东西,如果是用windows平台,则会出现很多小问题,或者即使 ...
- QQ2012安装不了怎么办?“提取安装文件失败”的解决方案
安装qq2012时提示"提取安装文件失败"该怎么办?在本篇教程中将为你介绍这个问题的解决方案! 安装过程中没有问题,把电脑上原来的版本也卸载了,到最后一步安装新版本,QQ2012的 ...
最新文章
- KnifeCMSV1.0Beta测试版发布
- [Delphi] Webbroker ISAPI 示例说明
- JDK注解(内置和自定义)
- 头上有多少根头发算秃头?
- 计算机入门的一些常用小技巧总结
- c语言补全程序,跪求高手解答简单的程序补全题~!
- java 算法比较,java几种面消隐算法的比较
- Atitit.atiDataStoreService v2 新特性
- php网站模板怎么改动,ECshop网站模板修改详细教程 and 模板对应的文件
- Spring Cloud Gray 微服务灰度中间件
- ntds(600)ntdsa:系统错误1453配额不足及恢复过程记录
- HinM_COMPILER_cale计划和实现
- 关于debug时的断点无效问题 [已解决,不知原因]
- Zookeeper源码之集群选举
- 2016亚洲城市GDP50强出炉
- 如何用Jmeter发送消息到Solace JNDI
- 检查计算机电源,台式机电源如何检测 电脑电源检测方法【详解】
- Upload-Labs靶场 1-21全通关教程
- iOS13正式版来了,付刷机方法教程,苹果关闭iOS12.4验证通道
- 【理科】2020年高考数学(第八章 立体几何)考点与题型全归纳