最近在测试环境发现使用asihttprequest连续访问2次以上的请求,非第一个请求如果包含表单文件post的话,如果和前一个请求相隔比较短的话,会有服务器无响应的情况发生。(生产环境使用https却发现不存在这种情况,测试使用的http)
刚开始以为可能的确是服务器接口有问题了,因为这种错误一般就是服务器的问题。但是后来发现使用其他方式请求,如使用fiddler模拟请求服务器是正常的,无论多少次。
于是对设备进行抓包。发现使用asihttprequest请求时,会复用上次请求的tcp连接,也就是长连接的概念。所以在request的header里面加上connection 为close的配置,发现错误依旧,抓包也发现header里还是keep-alive的。说明配置没生效。接着抓包研究了几天,也查询了asihttprequest框架的一些文档,发现shouldAttemptPersistentConnection 这个属性可以于是对设备进行抓包。发现使用asihttprequest请求时,会复用上次请求的tcp连接,也就是长连接的概念。所以在request的header里面加上connection 为close的配置,发现错误依旧,抓包也发现header里还是keep-alive的。说明配置没生效。接着抓包研究了几天,也查询了asihttprequest框架的一些文档,发现shouldAttemptPersistentConnection 这个属性可以设置request为短连接。
验证后发现故障消失,抓包也发现每次请求都新起一个端口来连接。
总结,一开始想设置短连接的思路是对的,可是常规设置无效,还是要参考框架资料才行。双管齐下研究问题。另外对于这些网络底层问题,抓包分析的确重要也直观。先是用了charles发现故障消失,后来发现应该是charles的代理之类。换成wireshark分析就重现问题了,所以还是要使用wireshark这种对于软件没有影响的东东观察才行。特此记录。