Thomas850
Thomas850
  • 发布:2016-07-11 18:04
  • 更新:2016-09-05 17:41
  • 阅读:2681

【报Bug】IOS环境下AJAX返回数据量较大时经常返回406,4月前在线打包版本无此问题

分类:HTML5+

在IOS环境下,前几个月同样的源代码,无论基座运行还是打包,ajax返回都是正常的;
但目前发现返回字符串较长的ajax经常出现406错误(此时httpResponse中返回的json字符串明显缺一部分,但仍有两三成可能ajax调用成功)。怀疑plus关于IOS环境下的Webview做过调整(Android同样代码没有问题),请问可以怎么处理?谢谢!

APP端,问题页面部分代码(从主页进入问题页面直接ajax访问服务器接口):


mui.plusReady(function() {  
    //默认查询全部  
    onSearchRegularJobList();  
});  

function onSearchRegularJobList() {  
    mui.ajax('http://192.168.60.60:8735/WCFService/SRV/TestJSON', {  
        type: 'get',  
        timeout: 10000,  
        crossDomain: true,  
        contentType: 'application/*',//这里原来是‘application/json’  
        data: ‘参数’,  
        dataType: 'text',  
        beforeSend: function(xhr) {  
            jobListContentElem.innerHTML = htmMsg.GetBeforeSend();  
        },  
        success: function(data, ts, xhr) {  
            var jdata = JSON.parse(JSON.parse(data));  
            var bizData = jdata.Result.Data || [];  
            var resHtml = template("pmyJobListContentTmpl", bizData );  
            jobListContentElem.innerHTML = resHtml;//显示数据  
        },  
        error: function(xhr, ts, et) {  
            console.log(xhr.status);//较长的返回字符串容易发生406错误  
            console.log(xhr.responseText);//发生406错误时,这里常有返回字符串的部分,明显不全  
            jobListContentElem.innerHTML = htmMsg.GetSendError(ts, et);//页面显示连接错误信息  
        }  
    });  
};

服务接口部分(基于.net WCF):
[OperationContract]
[WebInvoke(Method = "GET",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json)]
string TestJSON(string argServiceParam);

服务实现部分(基于.net WCF,简化为直接返回大串JSON字符串更容易看清,这里为了不使排版混乱,用字符串连接示意测试数据生成的过程 ):
public string TestJSON(string argServiceParam)
{
int len = 300;
string tData = "";
for (int i = 0; i < len; i )
{
tData = ",{\"RQ\":\"2016-07-09 00:00:00\",\"JZ\":\"公用系统\",\"ZY\":\"燃料\",\"BC\":\"白班\",\"SBMC\":\"\",\"GZNR\":\"系统运行方式切换(A.B侧设备在夜班第二次上煤切换、#10B每日白班第一次上煤时运行),系统切换及#10B胶带机试用情况在运行日志中记录。\",\"WCQK\":\"\",\"ZRBM\":\"燃运部\",\"BZ\":\"\"}";
}
return "{\"Status\":{\"Success\":true,\"Code\":\"0000\",\"Message\":\"OK\"},\"Result\":{\"Data\":[{\"RQ\":\"2016-07-09 00:00:00\",\"JZ\":\"公用系统j\",\"ZY\":\"燃料j\",\"BC\":\"白班j\",\"SBMC\":\"\",\"GZNR\":\"系统运行方式切换(A.B侧设备在夜班第二次上煤切换、#10B每日白班第一次上煤时运行),系统切换及#10B胶带机试用情况在运行日志中记录。\",\"WCQK\":\"\",\"ZRBM\":\"燃运部\",\"BZ\":\"\"}" tData "]}}";
}

2016-07-11 18:04 负责人:无 分享
已邀请:
Danny

Danny - QQ125904483

哥,升级到v3.2.0版本啦
还有,你试试4G网络吧

  • Thomas850 (作者)

    Danny哥,你才是哥。

    3.1肯定是不行的,3.2我也让人试,应该也是没成功(我后来没关注),基本能排除你的猜测。

    今天有大发现,我更清楚问题在哪里了:

    不是json太长,图片放json里都可以,其实是因为json结构复杂,包含的小对象一多就出问题。而且不管json对象是不是多次序列化过,都会有这问题。

    所以我们采用了一个让你吐血的办法绕过:加一个参数,服务端接口检测到这个新参数就对返回的json串再进行base64编码(可以兼容老app哦),这样除了数据量大点,其它就没问题了。

    我们怀疑:ios下的webview预处理疑似json串的ajax返回时会占爆某种资源,导致一定机率的失败,而且是近几月的webview才有的。

    哈哈哈大笑三声,手机打了这么多,我真服了自己

    2016-07-13 21:28

DCloud_IOS_XTY

DCloud_IOS_XTY

请提供个完整的demo,并说明重现步骤我确认下

  • Thomas850 (作者)

    好的亲,问题我已暂时绕过了,周末我弄个demo

    2016-07-13 21:32

Thomas850

Thomas850 (作者)

今天有大发现,问题更清楚了:
不是json串太长,图片放json里都可以,其实是因为json结构复杂,包含的小对象一多就出问题。而且不管json对象是不是多次序列化过,都会有这问题。
所以我们采用了一个办法绕过:服务端对返回的json串再进行base64编码,APP端再进行base64解码,这样除了数据量大点,其它就没问题了。
我们怀疑:ios下的webview预处理疑似json串的ajax返回时会占爆某种资源,导致一定机率的失败,而且是近几月的webview才有的。

Thomas850

Thomas850 (作者)

Demo见附件,重现步骤见附件中ReadMe.docx

wenju

wenju - https://www.mescroll.com -- 精致的下拉刷新和上拉加载组件

修复了吗 我也遇到此问题 麻烦尽快解决 我是把mui.js更新到v3.3 就出现问题了 之前3.0 还好好的

t***@qq.com

t***@qq.com

同问啊,出现406后后台少返回一些数据就正常了,但是有时候只有10几k也会出问题.
MUI.JS 版本3.1

wenju

wenju - https://www.mescroll.com -- 精致的下拉刷新和上拉加载组件

@Thomas850 @DCloud_IOS_XTY 现在是怎么解决的呢 我这个经常出现406

  • DCloud_IOS_XTY

    确认使用的最新版本,如果不行请提供可以复现问题的demo给我确认下

    2016-09-06 14:27

  • wenju

    回复 DCloud_IOS_XTY:我现在的问题是这样的了 不管是mui新版本还是旧版本 在本地运行的包苹果和安卓无论怎么点都没问题 然后我发全量更新包到外面ios就会偶尔出现406; 我现在怀疑是不是打包基座的问题; 我现在HBuilder是最新版本的 本地运行没有问题; 外面的版本是8月初打包上苹果商店的,现在都是全量更新...会不会是8月初打包基座的问题,, 我现在是重新打包发ios原生版本 正在审核中....如果审核过了 没有出现406那就是8月份打包基座有问题了

    2016-09-06 16:49

  • DCloud_IOS_XTY

    好的你确认下有问题在找我

    2016-09-06 17:58

该问题目前已经被锁定, 无法添加新回复