jQuery Ajax post 有时会转为使用 GET 方法 MVC

3

每当表单中的更改被持久化并存储在会话中时,我的页面都会调用以下行:

function persistFormDetails() {
    $.post("<%= Url.Action<AvailabilityController>(action => action.PersistForm(null)) %>", $("form#availabilityForm").serialize());
}

上述是从页面上发生的3个不同事件中调用的:$("select").change,$("#NumberOfNights").change,$("#PromoCode").change。

这些是对'PersistForm'唯一的3个调用。大多数情况下,这有效,但有超过5%的情况下,'PersistForm'会使用get而不是post进行调用。以下是我们网站日志中失败请求的摘录:

2012-08-07 06:17:34 120.151.214.16 - HTTP 10.12.0.151 80 POST /availability/persistform - 302 1151 434 0 HTTP/1.1 Mozilla/5.0+(iPhone;+CPU+iPhone+OS+5_1_1+like+Mac+OS+X)+AppleWebKit/534.46+(KHTML,+like+Gecko)+Version/5.1+Mobile/9B206+Safari/7534.48.3 __utma=212581192.532115380.1343637559.1343637559.1344320319.2;+__utmb=212581192.1.10.1344320319;+__utmc=212581192;+__utmz=212581192.1343637559.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);+.BREAKFREEBOOKING=H7n50kf8yh2VLsbC2Czo6LALPpef1jqj4RtcC4l34Q-fA3WKG8dD5Dps9CFq2i3j-YEVMEH5qTh_b5f7IDRJ5NYeB28gBV_czMmGeSfnd26FHsw83WbwBpz2K3oAVYCg6dG_MiOKqrpn8ViaBizKMKXD4yw1;+stella_referrer=referrerGuestId=14076864270&additionalInfo=mantra_on_kent_24h_sale30aug12&referrerSite= http://m.mantra.com.au/check-availability
2012-08-07 06:17:34 120.151.214.16 - HTTP 10.12.0.152 80 GET /availability/persistform chkCookies=True 302 950 353 0 HTTP/1.1 Mozilla/5.0+(iPhone;+CPU+iPhone+OS+5_1_1+like+Mac+OS+X)+AppleWebKit/534.46+(KHTML,+like+Gecko)+Version/5.1+Mobile/9B206+Safari/7534.48.3 __utma=212581192.532115380.1343637559.1343637559.1344320319.2;+__utmb=212581192.2.10.1344320319;+__utmc=212581192;+__utmz=212581192.1343637559.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);+.testCookie=.testCookie;+.BREAKFREEBOOKING=H7n50kf8yh2VLsbC2Czo6LALPpef1jqj4RtcC4l34Q-fA3WKG8dD5Dps9CFq2i3j-YEVMEH5qTh_b5f7IDRJ5NYeB28gBV_czMmGeSfnd26FHsw83WbwBpz2K3oAVYCg6dG_MiOKqrpn8ViaBizKMKXD4yw1;+stella_referrer=referrerGuestId=14076864270&additionalInfo=mantra_on_kent_24h_sale30aug12&referrerSite= http://m.mantra.com.au/check-availability

请注意,第一次调用“PersistForm”时进行了发布(正确),但然后是302(不确定为什么要重定向)。然后,同一用户在同一会话和时间内的下一个调用将调用“PersistForm”,并且这次是使用get。然后我们得到异常“在控制器'MG.Mobile.Controllers.AvailabilityController'上找不到公共操作方法'persistform'”。这很有道理,因为我的“PersistForm”操作具有HttpPost属性。
[HttpPost]
public ActionResult PersistForm(AvailabilityForm form)
{
    var model = _availabilityMapper.MapViewToDomain(form);
    _availabilitySession.SaveAvailabilityToSession(model);

     return new EmptyResult();
}

我们不能允许在此操作中使用GET方法,因为它会提交大量数据。正如我之前所说,这种情况只会发生大约5%的时间(可能更少)。
你有任何想法,为什么有时候我会得到一个“get”而不是“post”,或者为什么调用“persistform”有时会出现302重定向?
这是针对我们的移动站点的问题,而且这个问题只出现在iPhone上(但这可能只是巧合,因为我们网站75%的移动访问量都是来自iPhone)。
1个回答

1

有趣的问题。我在这里提出了一些假设。

我能看到的是,您的控制器是Sessionfull的。这意味着每个请求都会锁定Session对象,因此来自同一客户端的多个请求将一个接一个地处理(请求等待直到Session锁被释放)。

一旦您得到太多请求,服务器可能会达到某个阈值,因此重定向请求。

尝试的选项:

  1. 对于这样负载较重的API,最好采用无会话模型。
  2. 尝试利用ASP.NET MVC异步控制器。

谢谢您的回复。我会先尝试异步操作。不幸的是,我无法重现这个问题,所以必须等待并在下一次计划发布后查看日志。 - garethb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接