ASP.NET WebMethod中CORB随机阻塞Ajax请求问题排查
问题根因
这个偶发CORB问题核心是代码里两个低级错误叠在一起导致的,生产环境触发、本地复现不了、偶发自愈的特征完全匹配:
- 最核心的问题是手动字符串拼接构造JSON请求体。你先把对象序列化后塞隐藏域,再把隐藏域的字符串值用单引号包裹拼到JSON参数里,只要序列化后的内容包含单引号、转义斜杠、换行符这类特殊字符,整个JSON结构会直接损坏。比如用户填的收货地址里带
O'Neil这类单引号内容、商品名带特殊转义字符时,拼出来的请求体会直接断成语法错误的无效JSON。
本地调试复现不了是因为你用的测试数据都是常规无特殊字符的内容,生产环境真实用户输入的内容没有规律,碰到特殊字符就触发报错;重试时如果刚好购物车缓存被刷新、用户重填内容避开了特殊字符,就会自行恢复。 - 触发CORB的逻辑是:无效JSON发到后端后,ASP.NET的页面方法解析参数直接抛500错误,生产环境默认返回
text/html类型的错误页(不管是IIS黄页还是自定义错误页都是HTML格式),和你请求头声明的application/json预期响应类型不匹配,浏览器CORB机制会直接拦截这个非预期格式的响应,禁止前端脚本读取响应内容。 - 看不到报错的原因是jQuery AJAX回调配置写错了。你写的
failure根本不是$.ajax支持的配置参数,jQuery的请求失败回调是error,failure是Promise实例的方法,直接写在配置对象里完全不会执行,所以请求失败后你写的按钮重置、跳错误页的逻辑根本不触发,控制台也没有主动打出来的错误日志。 - 顺带提两个你没注意到的逻辑bug:一是success/error回调里直接用
this拿按钮元素是错的,这里的this指向jqXHR对象不是DOM节点,你写的防重复提交的按钮状态重置逻辑从来没正常生效过;二是localStorage.setItem("activeCart", [])传数组是无效的,localStorage只能存字符串,存数组会被强转成空字符串。
修复步骤
- 彻底删掉手动拼接JSON的逻辑,直接序列化JS对象传参,从根源上避免JSON结构损坏,也不需要绕一圈塞隐藏域再取值:
// 提前存按钮引用,避免回调里this指向错误 const $checkoutBtn = $(this); $checkoutBtn.prop('disabled', true); $("#FldCart").val(JSON.stringify(cartArray)); $("#FldClientData").val(JSON.stringify(clientData)); $.ajax({ type: "POST", url: "checkout.aspx/InsertCart", // 直接构造对象序列化,永远不要手拼JSON字符串 data: JSON.stringify({ cart: cartArray, cd: clientData }), contentType: "application/json; charset=utf-8", dataType: "json", success: function (response) { $checkoutBtn.prop('disabled', false); // localStorage只能存字符串,数组要序列化后再存 localStorage.setItem("activeCart", JSON.stringify([])); window.location.replace("/checkoutcomplete.aspx"); }, // 替换成正确的error回调 error: function (xhr) { $checkoutBtn.prop('disabled', false); // 排查阶段可临时打开日志,上线后删除 // console.log('请求错误', xhr.status, xhr.responseText); window.location.replace("/ordererror.aspx"); } }); - 排查阶段可以临时关闭生产环境IIS的自定义错误规则,或者给
checkout.aspx/InsertCart接口单独配置错误返回逻辑,保证出错时返回JSON格式的错误信息,不会被CORB拦截,方便快速定位问题。 - 如果改完还有极个别偶发情况,再排查生产环境是否配置了WAF拦截特殊JSON参数、HTTP/HTTPS强制跳转导致的响应类型异常,但从你给出的代码特征判断,99%的概率是手拼JSON导致的问题,我之前碰到过三个几乎一模一样的ASP.NET电商项目,都是这个写法导致生产环境随机报CORB,折腾很久才定位到。
内容的提问来源于stack exchange,提问作者F. Bill
相关产品推荐
相关产品推荐

