HTTP传输层异常处理办法及测试总结

 

HTTP传输层异常处理办法及测试总结

 

1.      URL错误,指URL格式不正确,未给出URL的情况。

HTTPURL验证可以直接判断出该错误。

 

2.      URL所指地址不存在

URL所指地址不存在,会造成CHttpFileSendRequest方法阻塞,这里采用同步模式进行数据传输。微软对于CHttpFile的传输超时设置是无效的,这一点是微软的BUG,在很多资料中已经说明了。微软建议采用通过独立的线程创建HTTP连接,主线程等待独立线程的运行,如果主线程等待超时则强行关闭改CInternetSession连接,从而迫使独立线程退出。

 

3.      HTTP请求发起阶段,即在SendRequest请求时,网络中断处理

主线程等待超时,会主动关闭从线程的CInternetSession连接。不过从线程返回的异常信息有两种,一种是:无法解析服务器地址。一种是:操作被取消。

返回两种异常是因为从线程的异常捕获是随机的,主线程强行关闭CInternetSession连接会产生“操作被取消”异常。CInternetSession要解析URL,如果无法解析其返回异常的时间是随机,所以两种异常返回是随机的。

 

4.        CInternetSessionCHttpConnectionCHttpFile三个对象哪一个是可以多次重复使用

HTTP对象的CInternetSessionCHttpConnection是可以多次重复使用的。

CHttpFile对象:

对于HTTP Get请求因为只用发送URL没有其他参数,故也可以重复使用。

HTTPPOST如果仅发送简单数据不包含文件也是可以重复。但如果传输了文件则需要每次重新创建该对象。

 

5.      传输文件时,网络异常中断,需要等待时间较长才能发现,如何解决。

HTTP传输时,网络断掉,CHttpFileWrite函数因为网络异常终止而被阻塞。程序会返回“与服务器连接意外终止”错误。从网络中断,到程序返回该异常需要等待近20S

进过反复的测试对于HTTP发送数据时突然的网络中断,用户这时想关闭连接则,只能terminate掉线程。其它方法都无法避免空指针,内存地址错误等问题。

但这会造成线程使用的一些资源无法释放,比如打开的文件无法关闭。解决的方法是使资源的句柄成为我所封装的HttpPostFile的成员变量。将HttpPostFile对象生命周期延长到线程外面,terminate掉线程后,deleteHttpPostFile对象就可以释放资源了。

 

6.      研究HTTP Post请求发送时可否不计算传输内容长度。答:不可以。

CHttpFile对象的SendRequest()将发送第一个TCP包,请求建立连接。如果Http协议的Content-Length-1则服务器返回请求实体太大。如果Content-Length0,则未等发送数据,则HTTP连接已经关闭。如果Content-Length大小与发送数据量不符,则服务器端未等客户端传输完成,就发送回响应页面从而大量的数据被丢弃。

 

7.      下载文件,直接采用WindowsAPI函数::WriteFile很不好,如果写入数据中含有了/0这样的东西,WriteFile函数会主动截断写入数据流,建议采用CFile类进行下载文件写入。

 

8.      在多线程编程中,在Work线程不要使用::AfxMessageBox函数向主界面发送消息,容易造成死锁。

 

9.      经过反复测试,发现CHttpFile对象系统提供的Buffer大小为8K

 

10.  HTTP传输建议做如下调整

将传输放入一个独立的线程,用“暂停”控制。每次HTTP请求的要传输的TransFile不是一个文件的概念,而是一个文件片的概念,该文件片最小为8K,最大为512K。如果当次HTTP因“暂停”而终止,或者因网络异常而终止,则该文件片的已传输内容也无效。

即在HTTP传输层,每一次传输请求只有成功和失败两种状态,每一次传输的数据量大小为“文件片大小”,所有大于“文件片大小”的文件都将划分为多个文件片进行传输。文件划分成文件片可以自动调整。


11.  HTTP请求发送不出去报 12150错误

       你所构造的HTTP请求头部出现了问题。头部添加的信息Key:Value的格式,你所添加的部分信息存在不完整的情况。

 

你可能感兴趣的:(HTTP传输层异常处理办法及测试总结)