2

私は c# で asp.net Web アプリケーションを作成していますが、iPhone 4 および 5 でページを表示するときにわずかな問題が発生しました (他のモバイル ユーザーからの報告がないため、他のモバイルについてはわかりません)。

デスクトップブラウザでページを表示すると、すべて正常に機能します。ユーザーがテキスト ボックスに電子メール アドレスを入力し、ボタンをクリックすると、何が起こりますか。ボタンに ajax 経由で Web メソッドを呼び出す Javascript JQuery があり、Web メソッドは json で ID と名前のリストを返します。ボタンは Web ページのドロップダウン ボックスにこの情報を入力します。

ユーザーは、サイトの別の部分からデータベースに情報を追加できます。上のボタンをクリックすると、返されるリストが大きくなり、新しい情報が含まれます。しかし、iPhone 5 で、ページに戻ったときに ajax 呼び出しが行われていないように見え (発生時にポップアップが短時間表示されます)、ドロップダウン ボックスにデータベースの新しい情報。電話 CACHE からの情報を表示しているだけだと思います。

サファリ設定に入り、Cookie とデータ/Web データを削除してから、Web ページに移動すると、すべてのドロップダウンが読み込まれ、Ajax 呼び出しが機能します (ポップアップが表示されるまでお待ちください)。以下のコード行を page_load のマスター ページに追加しようとしましたが、うまくいきません。

Response.Cache.SetNoStore();

他に何かしなければならないことはありますか?私が言うように、このサイトはデスクトップ ブラウザーで動作しますが、私はモバイル開発者ではありません (Web ブラウジングにモバイルを使用することさえありません)。

ヘルプ/アドバイスに感謝します。

4

1 に答える 1

0

これがキャッシュ関連であるというあなたの理論は正しいです.iOS 6は、POSTを含むキャッシュ制御ヘッダーが提供されていない場所で、より積極的にキャッシュします. iOS 6 の Safari は $.ajax の結果をキャッシュしていますか?を参照してください。詳細については。

私たちも同じ問題を抱えており、これに対して取ったアプローチは、すべての POST 要求に対して常にこのヘッダーを設定する HttpModule をサイトに追加することでした。

public class DisablePostCachingModule : IHttpModule
{
    private HttpApplication _context;
    public void Init(HttpApplication context)
    {
        _context = context;
        _context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose()
    {
    }

    private void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        if (HttpContext.Current.Request.HttpMethod == "POST")
        {
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        }
    }
}

これを以下のように Web.config に接続すると、うまくいきました。

<configuration>
  <system.webServer>
    <modules>
      <add name="DisablePostCachingModule" type="Full.Namespace.To.DisablePostCachingModule, AssemblyName" />
    </modules>
  </system.webServer>
</configuration>

IIS7 の統合モードを使用していない場合は、<system.web>代わりに使用できます。

<configuration>
  <system.web>
    <httpModules>
      <add name="DisablePostCachingModule" type="Full.Namespace.To.DisablePostCachingModule, AssemblyName" />
    </httpModules>
  </system.web>
</configuration>

上記のどちらの場合でも、明らかにFull.Namespace.To、モジュールに使用した名前空間とAssemblyName、モジュールが存在するアセンブリの名前に更新する必要があります。たとえば、次のようになります。

<add name="DisablePostCachingModule" type="Acme.HttpModules.DisablePostCachingModule, Acme.Core" />
于 2013-01-11T09:50:59.350 に答える