フォームに変更が加えられるたびに呼び出される次の行がページにあります(フォームの変更は永続化され、セッションに保存されます)。
function persistFormDetails() {
$.post("<%= Url.Action<AvailabilityController>(action => action.PersistForm(null)) %>", $("form#availabilityForm").serialize());
}
上記は、ページで発生する3つの異なるイベントから呼び出されます:$( "select")。change、$( "#NumberOfNights")。change、$( "#PromoCode")。change。
これらは、「PersistForm」への3つの呼び出しのみです。これはほとんどの場合機能しますが、5%を超える場合、「PersistForm」はpostではなくgetを使用して呼び出されます。失敗したリクエストについては、ブログから抽出してください。
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を使用します。次に、「パブリックアクションメソッド'persistform'がコントローラー'MG.Mobile.Controllers.AvailabilityController'で見つかりませんでした」という例外が発生します。
'PersistForm'アクションにはHttpPost属性があるため、これは理にかなっています。
[HttpPost]
public ActionResult PersistForm(AvailabilityForm form)
{
var model = _availabilityMapper.MapViewToDomain(form);
_availabilitySession.SaveAvailabilityToSession(model);
return new EmptyResult();
}
大量のデータを投稿するため、このアクションを許可することはできません。前に言ったように、これは約5%の時間しか発生しません(多分それ以下)。
「post」の代わりに「get」を取得することがある理由、または「persistform」302(リダイレクト)を呼び出すことがある理由についてのアイデアはありますか?
これは私たちのモバイルサイト用であり、問題はiPhoneでのみ発生しました(ただし、私たちのサイトへのモバイルアクセスの75%がiPhoneであるため、これは偶然の一致である可能性があります)。