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

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

HTTP有URL验证可以直接判断出该错误。

 

  1.       URL所指地址不存在

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

 

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

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

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

 

  1.         CInternetSession,CHttpConnection,CHttpFile三个对象哪一个是可以多次重复使用

HTTP对象的CInternetSession、CHttpConnection是可以多次重复使用的。

CHttpFile对象:

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

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

 

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

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

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

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

 

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

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

 

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

 

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

 

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

 

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

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

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


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

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


你可能感兴趣的:(网络,服务器,资料,微软,信息)