通过AJAX向WebService传递JSON数组报500错误(缺少totalKilos参数)求助
问题根因
服务端返回的报错已经明确指向问题核心:调用ASMX WebService接口时缺少必填参数totalKilos。你当前提交的JSON结构仅包含lista字段,和服务端insertarSolicitudVenta接口定义的入参列表不匹配,因此触发500错误。
解决方案
1. 核对服务端入参定义
先确认后台insertarSolicitudVenta方法的参数规则,常规情况下该接口的参数列表会包含两个字段:
- 对象数组类型的
lista(和你当前提交的字段对应) - 数值类型的
totalKilos(你当前缺失的必填字段)
注意参数名大小写必须和后台定义完全一致,ASMX反序列化对大小写敏感
2. 修正提交的JSON结构
补全totalKilos字段,值为所有lista数组中CantidadKilos的总和,数值类型不要加引号避免反序列化失败,示例结构:
{ "lista": [ { "idSolVenta": "1", "rutEmpresa": "123456789", "idDetalleSolicitud": "1", "idCategoria": "3", "idSubcategoria": "8", "CantidadKilos": 123456 }, { "idSolVenta": "1", "rutEmpresa": "123456789", "idDetalleSolicitud": "1", "idCategoria": "3", "idSubcategoria": "8", "CantidadKilos": 123456 } ], "totalKilos": 246912 }
3. 修正AJAX请求代码
删除冗余且错误的beforeSend配置(其中application/j-son为错误的MIME类型,且你已经在contentType中声明了正确的JSON类型),同时确保提交的data是JSON字符串而非JS对象:
// 构造提交数据的示例代码 const sumKilos = lista.reduce((total, item) => total + Number(item.CantidadKilos), 0); const submitData = { lista: lista, totalKilos: sumKilos }; const salida = JSON.stringify(submitData); // 修正后的AJAX请求 $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "http://localhost:63160/WebServiceDetalleSolicitudVenta.asmx/insertarSolicitudVenta", data: salida, dataType: "json", success: function () { alert("SUCCESS!"); }, error: function (msg, source, lineNo, columnNo, error) { alert("Error: " + msg + "\nScript: " + source + "\nLine: " + lineNo + "\nColumn: " + columnNo + "\nStackTrace: " + error); } });
额外排查点
如果修改后仍然报错,可检查:
- 服务端是否开启了POST请求权限,ASMX默认仅支持SOAP协议调用,需要在web.config中配置
<webServices><protocols><add name="HttpPost"/></protocols></webServices>才支持JSON POST请求 - 若前端和服务端域名、端口不一致,需要单独配置ASMX的跨域规则
内容的提问来源于stack exchange,提问作者LightningVolt
相关产品推荐
相关产品推荐

