在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 "]}}";
}
Thomas850 (作者)
Danny哥,你才是哥。
3.1肯定是不行的,3.2我也让人试,应该也是没成功(我后来没关注),基本能排除你的猜测。
今天有大发现,我更清楚问题在哪里了:
不是json太长,图片放json里都可以,其实是因为json结构复杂,包含的小对象一多就出问题。而且不管json对象是不是多次序列化过,都会有这问题。
所以我们采用了一个让你吐血的办法绕过:加一个参数,服务端接口检测到这个新参数就对返回的json串再进行base64编码(可以兼容老app哦),这样除了数据量大点,其它就没问题了。
我们怀疑:ios下的webview预处理疑似json串的ajax返回时会占爆某种资源,导致一定机率的失败,而且是近几月的webview才有的。
哈哈哈大笑三声,手机打了这么多,我真服了自己
2016-07-13 21:28