[TWebBrowser] キャッシュを読まずに表示させたい


Kenny  2010-10-09 01:49:40  No: 39332

WinXP+D7環境です。Navigateメソッドで指定URLにジャンプするとき、開発環境のXP+IE8ではキャッシュを読まずに
新規にサイトを読み込んで表示するようですが、できあがったEXEをXP+IE7の環境に持って行くとキャッシュを
読み込んでしまい、表示が更新されません。
その場合でも、IEのオプションでキャッシュを読まない設定にすればそのように動作しますが。
Navigateメソッドの第2引数にnavNoReadFromCacheを指定する、と言うのも全く効果がありません。
これに関しては  http://msdn.microsoft.com/en-us/library/dd565688  でもNot implementedと言うことで、使えないのだと思います。
試しに
    WebBrowser1.Navigate(URL);
    while WebBrowser1.ReadyState < READYSTATE_COMPLETE do
      Application.Processmessages;
    WebBrowser1.Refresh;
    while WebBrowser1.ReadyState < READYSTATE_COMPLETE do
      Application.Processmessages;
    WebBrowser1.Navigate(URL);
    while WebBrowser.ReadyState < READYSTATE_COMPLETE do
      Application.Processmessages;
このようにしても、更新が完了する前にREADYSTATEがREADYSTATE_COMPLETEになるようで、キャッシュが
更新される前にNavigateしてしまい、結果更新していないページが表示されます。

何か回避する手はないでしょうか。IEのオプションを書き換える、と言う手も検討していますが…。


もしかしたら  2010-10-09 04:11:56  No: 39333

Refresh2を利用できないでしょうか。
読み込む階層を指定できますが。


monaa  2010-10-09 23:14:00  No: 39334

最近忙しくて中々書き込めませんが、
  DeleteUrlCacheEntry(aURL); //uses wininet
  WebBrowser1.Navigate(aURL);
これで私の方は更新反映できました。


Kenny  2010-10-10 02:07:24  No: 39335

もしかしたら さん、monaaさん、ありがとうございます。
キャッシュを読ませたくないならば削除してしまえばよい、というのは私も思いつきまして只今テスト中です。
現在の所3つ問題がありまして、

(1) アドレスとエントリー名が一致しない場合がある
Googleの場合エントリー名もhttp://www.google.co.jp/なのですが、http://www.yahoo.co.jp/にアクセスした場合
キャッシュに残るエントリー名はhttp://www.yahoo.co.jp/javascript/fp_base_bd_ga_4.3.6.jsのようで
単純にURL名をキャストして渡しても消せない。

(2)  エントリーを削除しても、画像キャッシュは再使用される
チェックしたいのはその画像の方でして。そのURLに関係するキャッシュ全てを探し出して削除する必要があるようです。

(3)ディスクアクセスの関係か、まれにキャッシュを読み込む
ちなみに、キャッシュを残さないようにと思い、
  WebBrowser1.Navigate(sURL);
  if DeleteUrlCacheEntry(pChar(sURL)) = True then
    Showmessage('Deleted!')
  else
    Showmessage('NoCacheFile');
こうしても'NoCacheFile'が返ってきます。時間をおいて別のボタンイベントでDeleteUrlCacheEntryすれば当然削除できるのですが。
ディスクアクセスが間に合わないようです。


ん?  2010-10-10 03:20:09  No: 39336

チェックしたいのは Yahooのページ内にある画像なの?
Yahooのページはレスポンスヘッダが次のようになってるから、ページのソースはキャッシュには残らないよ。つまりキャッシュを消す必要もないということ。
Cache-Control: no-cache
Cache-Control: no-store, must-revalidate
Expires: -1
Pragma: no-cache

画像をチェックしたいのなら、WEBページでなく直接その画像を読み込んで
調べるべきでしょう。
チュックする画像というのは、画像が変わればそのURLも変わるの?


Kenny  2010-10-10 04:36:23  No: 39337

ん?さん、ありがとうございます。Yahooというのは一つの例と言う意味で、目的のサイトではありません。
言葉足らずでした。
しかし、キャッシュに残らないというのは大変貴重なアドバイスで、参考にさせて頂きます。
目的のサイトの画像は、日付や顧客番号などをパラメーターとして渡して、その計算結果のグラフが画像化されて
表示されていて、これまで見たところでは、日付や表示サイズらしきものもURLに含まれていて、
URLの保証が期待できないのです。


武田  2010-10-11 20:51:23  No: 39338

TWebBrowser 互換のフリーのTEmbeddedWBを使えば
http://www.bsalsa.com/index.html
小生の場合キャッシュから読み読まないのボタンがチェック状態なら
Navigateする前にキャッシュを読まないようプロパティをセットをして
if Form1.Chash1.Checked  then 
EmbeddedWB1.DownloadOptions:=EmbeddedWB1.DownloadOptions - [DownloadAndIgnoreCache]
 else 
EmbeddedWB1.DownloadOptions:=EmbeddedWB1.DownloadOptions + [DownloadAndIgnoreCache];
のように DownloadOptionsをtrueにしてからNavigateするようにしています。

英語なので正確にはわかりませんが、そのように理解して使っています。
TWebBrowser と完全互換ですから、ばっさり入れ替えるだけで動きます。
スクリプトエラーストップだけ違うようですがよりわかりやすいです。
インターネットオプションもHomePageもブラウザ画面のポップアップも
IEと共用ですから
Irvineなど追加インストールメニューもIEと同じで使えます。
ものすごい高性能ブラウザコンポなのに
変に独自性を表に出さないので使いやすいです。
はずしていたらごめんください。


試してみた  2010-10-12 06:22:16  No: 39339

>EmbeddedWB1.DownloadOptions:=EmbeddedWB1.DownloadOptions + [DownloadAndIgnoreCache];
>のように DownloadOptionsをtrueにしてからNavigateするようにしています。

↑これは、Navigateする際にリクエストヘッダに
Cache-Control: no-cache
の行を追加することと同じであると確認しました。
しかし、そうしてもキャッシュ(インターネット一時ファイル)が存在すると
サーバーにアクセスしないでキャッシュから読み込んでしまいますね。
確実にサーバーから読み込んで更新するには、やはりキャッシュを
削除しないとダメのようです。


Kenny  2010-10-12 19:42:42  No: 39340

武田さん、「""$"!! 」さん、ありがとうございます。
最初に「IEのオプションでキャッシュを読まない設定にすればそのように動作しますが。」と書きましたが、
どうも旨く動作しないXP+IE7環境では、画像キャッシュはオプションに関係なく、使用されてしまうようです。
キャッシュオプションを指定しているレジストリを一時的に変更することも試してみましたが、やはり
タイミングの問題でブラウザに旨く設定が反映されなかったりしますし、管理権限の問題もありますし、
その方法は没にしました。

と言うことで、現在はキャッシュをばっさり削除すると言う方法を取り入れて旨く動作しています。
かなり迷惑な動作ですね。(^-^;)
この件に関しては、こちらでも良くアドバイスされているMr.XRAYさんのライブラリを参考にさせて頂きました。
皆さん、ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加