Asp.Net MVC Ajax POST本地正常,部署AWS后传空值且请求两次求助
解决Asp.Net MVC部署AWS后Ajax传空数据且Action被调用两次的问题
兄弟,我来帮你理一理这个问题的解决方向——本地跑的好好的,一上AWS就出问题,还触发两次请求,大概率是请求触发逻辑或者AWS环境配置的锅,咱们一步步来排查:
1. 先搞定Action被调用两次的问题,这是根源
你说第一次有数据第二次空,那首先得搞清楚为啥会发两次请求:
- 检查触发请求的按钮是不是
submit类型?如果是,点击的时候会同时触发Ajax和表单的默认提交,就会发两次请求。赶紧给按钮加上type="button",或者在点击事件里加event.preventDefault()阻止默认行为:// 假设你的按钮选择器是#registerBtn $("#registerBtn").click(function(event) { event.preventDefault(); // 阻止表单默认提交 // 你的Ajax代码 var postdata = { password: password, name: name, email: email, designation: designation, comp: comp, phone: phone, country: country, state: state, cid: id }; $.ajax({ type: "POST", url: '@Url.Action("RegisterUser", "Home")', data: postdata, traditional: true, success: function (data) { if (data == "") { alert("already exists"); } else { window.location.href = data; } } }) }); - 再看看是不是页面里的事件被重复绑定了?比如用了
$(document).on("click", ...)这种委托,页面初始化多次的话就会绑多次,触发一次按钮就发多次请求。可以给事件绑定加个解绑逻辑,比如$("#registerBtn").off("click").on("click", ...)。
2. 优化Ajax请求的参数传递方式
本地正常但AWS出问题,可能是请求格式在AWS的代理(比如ALB、CloudFront)里被篡改了,换用JSON格式传递更稳妥:
- 先建个ViewModel类来接收参数,比单个参数更可靠:
public class RegisterUserModel { public string Password { get; set; } public string Email { get; set; } public string Name { get; set; } public string Country { get; set; } public string State { get; set; } public string Designation { get; set; } public string Cid { get; set; } public string Comp { get; set; } public string Phone { get; set; } } - 然后修改控制器Action,用
[FromBody]接收JSON:[HttpPost] public ActionResult RegisterUser([FromBody] RegisterUserModel model) { // 直接用model.Password、model.Email这些属性就行 } - 最后调整Ajax请求,指定
contentType并把数据转成JSON字符串:$.ajax({ type: "POST", url: '@Url.Action("RegisterUser", "Home")', data: JSON.stringify(postdata), contentType: "application/json", // 明确指定内容类型 traditional: true, success: function (data) { // 回调逻辑不变 } })
3. 排查AWS环境的配置坑
AWS的服务有时候会悄悄改你的请求,得检查这些点:
- CloudFront缓存:如果你的接口路径被CloudFront缓存了,可能会触发旧的请求。去CloudFront的行为设置里,把
/Home/RegisterUser这个路径的缓存策略改成「CacheDisabled」,确保每次请求都打到后端。 - ALB重定向:如果ALB设置了HTTP转HTTPS的重定向,第一次HTTP请求可能会被重定向成HTTPS,导致两次请求。可以直接在页面里用HTTPS发起请求,或者检查ALB的重定向规则是否会携带请求参数。
- WAF规则:如果开了AWS WAF,看看有没有规则拦截或修改了请求参数,暂时关掉WAF测试一下,要是问题消失了就调整WAF规则。
4. 加日志排查细节
实在搞不定的话,就在控制器里加日志,把每次请求的参数、请求头都记下来,对比两次请求的差异:
public ActionResult RegisterUser(string password, string email, string name, string country, string state, string designation,string cid,string comp,string phone) { // 把请求信息写到CloudWatch日志里 System.Diagnostics.Trace.WriteLine($"请求来源:{Request.UserHostAddress},时间:{DateTime.Now},Password:{password},Email:{email}"); // 原有业务逻辑 }
然后去CloudWatch里看日志,就能清楚第一次和第二次请求的参数、请求头有啥不一样,针对性解决。
内容的提问来源于stack exchange,提问作者Kunal
相关产品推荐
相关产品推荐

