3

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

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

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

这些是对“PersistForm”的仅有的 3 次调用。这在大多数情况下都有效,但超过 5% 的时间,使用 get 而不是 post 调用“PersistForm”。从我们的博客中提取失败请求:

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();
}

我们不能允许获取此操作,因为它会发布大量数据。正如我之前所说,这只发生在大约 5% 的时间里(也许更少)。

关于为什么我有时会得到“get”而不是“post”或为什么有时会调用“persistform”302(重定向)的任何想法?

这是针对我们的移动网站的,问题只出现在 iPhone 上(但这可能只是巧合,因为我们网站的 75% 的移动访问是使用 iPhone 进行的)。

4

1 回答 1

1

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

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

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

尝试的选项:

  1. 对于如此重载的 API,最好使用 Session-Less 模型。
  2. 尝试利用 ASP.NET MVC 异步控制器。
于 2012-08-09T07:14:04.790 回答