2012-05-09 25 views
7

更新パネルといくつかのボタンを使用するAsp.Net 4.0 Webサイト/コントロールインターフェイスがあります。更新パネルは、5秒ごとに実行されるタイマーに配線され、部分的なポストバックが発生します。ボタンはいくつかの設定を切り替えた後、これと同様の呼び出しにより更新パネルの更新を強制的に:ASP.NET Ajaxポストバックが突然IPhone/IPadで停止する

var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm._doPostBack('<%= UpdatePanel.ClientID %>', ''); 
return true; 

サイトはIE/Firefoxの上とSafariのモバイル機器(IPhone/iPadアプリ)ではなく、モバイル上で正常に動作しますポストバックをランダムにデバイスに通知し、サイレントで作業を停止します。私はこれを図は、電池を節約することと関係があり、サファリはアイドル時に部分的なポストバックをシャットダウンすると判断します。問題は、ユーザーがサイトに戻ったときに、ポストバックが完全に停止し、タイマーもボタンもポストバックがなくなることです。 (私はこれを確認するためにサーバー上のネットワークトラフィックを監視しています)。ユーザーがウェブサイトをリフレッシュしても(複数回)、部分的なポストバックが再生に戻ってくることはありません。サーバーへのデータのポストを止めるだけです。その後、突然、特に理由なく、ポストバックが再び働き始める。停止時間はしばしば最大10分であり、その目的のために私のウェブサイトは完全に役に立たない。

ポストバックが再び始まる前にもう一度時間がかかることを考えれば、クライアント側またはIISで再生する設定があるのだろうか?

ウェブサイトは私の顧客のデバイス(公開されていないデバイス)でのみ動作します。そのため、クライアントで再生する設定があれば、私はそれを実現しています。

私はこれについて本当に混乱していて、 "バグ"を引き起こす方法を見つけていません。アドバイスやヒントは非常に高く評価されています。


更新:

は、いくつかのエラー処理を追加しましたし、私は(ない一貫)ポストバックが失敗したときに次のメッセージが表示されています:

ページは、非同期ポストバックが、のScriptManagerを行っています。 SupportParialRenderingプロパティはfalseに設定されます。ポストバック時にプロパティがtrueに設定されていることを確認してください。

このプロパティは、最初のインスタンスのデバイスにとって明らかに十分です。そうでない場合は、ポストバックがうまくいきません。


アップデート2: browserCapは、web.configファイルに設定を変更することを示唆しているfolloingのブログの記事を見つけました。これを今試みている。報告する。他の提案はまだ大いに歓迎されています。 ASP.NET 4 BrowserCaps (or: what were they thinking?)

上記は、フルスクリーンモード(ホーム画面から実行中)のSafariモバイルでjavascriptを無効にします。次の記事では、この問題の修正を提案しています。 Gotcha: iPad versus ASP.NET

答えて

6

私の質問の「更新2」の結果は、この問題を解決します。次のブログ記事で識別されるどうやらサファリいるUserAgentは時折、Mozillaの0.0として認識:ASP.NET 4 BrowserCaps (or: what were they thinking?)

最初のWTFは、それが応じてブラウザから非同期ポストバックを検出した場合、.NETフレームワークは、実際に例外をスローすることですto BrowserCapsは非同期ポストバックをサポートしていません。これは逆の圧倒的な証拠があっても、非同期のポストバックが可能な人が一番よく知っていると思っているかのようです...

次のWTFはかなりわかりにくいです。なぜSafari UserAgentsがMozilla 0.0と認識されるのですか?例外からコピーしたばかりのUserAgent文字列を使用していても問題を再現できませんでしたか?

答えは

<browserCaps userAgentCacheKeyLength="64" />

にあるユーザエージェントのキャッシュキーの長さのデフォルト設定は、UserAgent文字列の最初の64個の文字を取ることです。 ...

とPage Downさらに:

256にuserAgentCacheKeyLengthを設定するには、Mozilla 0.0として識別されているそこのUserAgent文字列が残っているにもかかわらず、問題を解決しました。少なくとも今は一貫している。

したがって、Web.Configに<browserCaps userAgentCacheKeyLength="256" />を設定すると問題が解決します。


これは、残念ながら、Safariブラウザをフルスクリーンモード(リンクがホーム画面に保存された)で使用されている別の問題が発生します。フルスクリーンモードでは、Safariは異なるHTTPユーザーエージェント文字列を使用し、ASP.NETはブラウザをSafariとして認識せず、機能を持たない汎用ブラウザとして認識します。たとえば、JavaScriptとJQueryは機能しなくなります。さらにGotcha: iPad versus ASP.NETで詳述されています。これを解決するには、各WebサイトにPage_Initで次のように入力します。それほどエレガントではありませんが、上記と一緒に動作します:

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    if (Request.UserAgent != null && Request.UserAgent.IndexOf("AppleWebKit", StringComparison.CurrentCultureIgnoreCase) > -1) 
    { 
     this.ClientTarget = "uplevel"; 
    } 
} 
+0

ありがとう@Avada Kedavra!まったく同じ問題があったので、 ''それを修正しました。とても有難い! 'Page_PreInit'セクションにまだ入れていないのですが、これはMasterPageに置くだけで全ページを処理できるのでしょうか? –

+0

@mcpDESIGNS:私はそれを試していませんが、コードを少なくして解決策を作る方法に興味があります。あなたが提案したアプローチで成功しましたか? –

+0

もう少しテストをしなければならないでしょう。私はあなたに知らせるでしょう!そして、私は 'Page_PreInit'をマスターページに置くと、すべての子ページにコピー/貼り付けする必要がなくなります。 –

関連する問題