WebBrowserなどでキャッシュさせないようにするには?

解決


BIOPRIN  2004-09-24 03:30:19  No: 85720

いつも参考にさせていただいています。

表記の通りなんですが以下のようにおよそ10分おきにアクセスしています。
(バナー広告の自動クリックとかじゃないですよ(T_T))
(注:テスト時はテストサーバに60秒おきに送信しています)
アクセスしている部分  →  WebBrowser1.Navigate (strURLbuf)

しかし、何時間放置しても更新されません。(初回取得時のみ正常稼動)
受け取り側はperlで書いていますがアクセスされた形跡もありません。また、perl側でもキャッシュされないように処理しています。

WebBrowserを通常隠していますが表示して確認しています。
このとき、右クリックして最新の情報にしたりすると、きちんとアクセスしてくれます。普通にIEとかでアクセスするとこれまたきちんとした結果を返してきます。

・perl側で、データの有効期限も付け加えたほうがいいのでしょうか?
・WebBrowser(inetとか)などで対応できるのでしょうか?
・WebBrowserに擬似的にキーを送ったほうがいいのでしょうか(Ctrl+F5とか)

お助けください。お願いします。


魔界の仮面弁士  2004-09-24 05:04:28  No: 85721

一応、Navigate2 の第2引数用に、「navNoReadFromCache」という定数が
用意されてはいるのですが、現在はサポートされていません。
http://msdn.microsoft.com/workshop/browser/webbrowser/reference/enums/browsernavconstants.asp

キャッシュされないようにするために、
  URL = "http://server/test.cgi?dummy=" & Format(Now(), "YYYYMMDDHHNNSS")
  WebBrowser1.Navigate2 URL
などのようにして、毎回異なるURLを渡すようにしてみては如何でしょう。

> ・perl側で、データの有効期限も付け加えたほうがいいのでしょうか?
現在の所、サーバー側から返される HTTP応答ヘッダからは、
どのような結果が返されてくるようになってているのでしょうか?

> ・WebBrowser(inetとか)などで対応できるのでしょうか?
コンポーネントによっては、キャッシュを使わずに読み込ませるための
機能を備えている物もあります。たとえば、VB6 の UserControl には、
AsyncRead というメソッドがあるのですが、ここに vbAsyncReadForceUpdate という
定数を指定する事で、キャッシュを無視して読み込ませる事が可能となっています。

> ・WebBrowserに擬似的にキーを送ったほうがいいのでしょうか(Ctrl+F5とか)
お望みの動作に近い物としては、Refresh2 メソッドがあります。


BIOPRIN  2004-09-24 05:28:45  No: 85722

魔界の仮面弁士さん  ありがとうございます。できました。
ちょっと姑息な手段ですが・・・以下のようにしました

WebBrowser1.Navigate2 (strURLbuf & "&" & Format(Now(), "YYYYMMDDHHNNSS"))

毎回違うアドレスという認識なのかこれならうまく動きます。

>現在の所、サーバー側から返される HTTP応答ヘッダからは、
>どのような結果が返されてくるようになってているのでしょうか?
現在はCGI側でHTML(タグなし)を作成し、それを返しています。
正常な通信かどうかはHTMLのコードを解析しています。
たとえばエラーなら"-1:SystemError"のような返答が帰ってきます。
…あまり良くないですが、このプログラムは送り続けることに意味があるものなので、現在はこれでヨシとしちゃっています。

>コンポーネントによっては、キャッシュを使わずに読み込ませる。。。
>お望みの動作に近い物としては、Refresh2 メソッドがあります。
これは非常に参考になりました。あとで勉強してみます。
refresh2はどのような結果になるのかわからないのですが、もしブラウザの再読み込みと同じなら今回は誤動作してしまう可能性があるので利用できません。(HTTPリクエストの再要求になっちゃうとまずいので)

表題の件、解決しました。ありがとうございました!

もし、教えていただけるなら、後一点。
WebBrowser1.Navigate
WebBrowser1.Navigate2
この違いってなんですか??
同じような動作をするのでいまいち区別がつきません。

#それにしてもWebBrowserについては検索してもなかなか出てこないものですね。。。余り使われないのかな??


魔界の仮面弁士  2004-09-24 06:01:53  No: 85723

>> 現在の所、サーバー側から返される HTTP応答ヘッダからは、
>> どのような結果が返されてくるようになってているのでしょうか?
> 現在はCGI側でHTML(タグなし)を作成し、それを返しています。

あ、すみません。
私がお聞きしたのは、HTTPのボディ部ではなく、ヘッダ部の方です。

例えば、
  HTTP/1.1 200 OK
  Date: Thu, 23 Sep 2004 11:37:13 GMT
  Proxy-Connection: close
  Connection: close
  Content-Type: text/plain
などの情報の事です。
現在は、どのような結果を返すようにしているのでしょうか?

perl側で「キャッシュされないように処理している」という事でしたが、
具体的な話が無かったので、その確認という事です。
# たとえば、
#   Pragma: no-store
# とか、あるいはそれに類する情報を渡しているという事でしょうか?

> WebBrowser1.Navigate
> WebBrowser1.Navigate2
後者はIE3当時は存在しなかったメソッドですね。これらを良く見ると、
両者で『第1引数のデータ型』が異なっている事に気が付くでしょう。
http://msdn.microsoft.com/workshop/browser/webbrowser/reference/methods/navigate.asp
http://msdn.microsoft.com/workshop/browser/webbrowser/reference/methods/navigate2.asp

上記にも書いてありますが、Navigate2 では、シェルネームスペースへの
対応が行われています。以下のコードを試してみてください。

Option Explicit
Private Const ssfDRIVES As Variant = &H11&

Private Sub Form_Load()
    Me.Command1(0).Caption = "Navigate2"
    Me.Command1(1).Caption = "Navigate"
End Sub

Private Sub Command1_Click(Index As Integer)
    If Index = 0 Then
        Me.WebBrowser1.Navigate2 ssfDRIVES
    Else
        Me.WebBrowser1.Navigate ssfDRIVES
    End If
End Sub

> それにしてもWebBrowserについては検索してもなかなか出てこないものですね
海外にも目を向けてみると、比較的多くの資料が見つかるかと思いますよ。


BIOPRIN  2004-09-25 23:55:07  No: 85724

魔界の仮面弁士さん  ありがとうございます。

ヘッダ部分は現在いじってないので、書いていただいたとおりだと思います。
(基本的にサーバーが付加するもののみ)
  HTTP/1.1 200 OK
  Date: Thu, 23 Sep 2004 11:37:13 GMT
#  Proxy-Connection: close  これはわかりません
#  Connection: close
  Content-Type: text/plain
#  ↑これはCGI側でだしています。
  こんなかんじで
    print "Content-type: text/html;\n\n";
    print $html;
    exit;

>perl側で「キャッシュされないように処理している」という事でしたが、
>具体的な話が無かったので、その確認という事です。
これは再度要求されても結果を保持せず、
もう一度実行するようにしています。
このあと、SQLへアップデート処理を渡しています。

my $q = new CGI;
$| = 1;

単純ですがこれで実現できると聞いています。間違っているかも!?

>後者はIE3当時は存在しなかったメソッドですね。
そうだったのですか。知りませんでした。
お教えいただいたサンプルを見ながら勉強させていただきます。
また、海外にも目を向けて探してみたいと思います。


魔界の仮面弁士  2004-09-26 03:00:44  No: 85725

> ヘッダ部分は現在いじってないので、書いていただいたとおりだと思います。
いや、もっといろいろなヘッダが付属しているはずだと思いますが…。

たとえば、フリーソフトの「InetSpy」などを使う事で、
Webサーバとの間で行われている通信内容を確認できますので、
一度、確認されて見ては如何でしょう。

>(基本的にサーバーが付加するもののみ)
その、自動的に付加される部分を確認したかったのです……。

というのは、キャッシュがどの時点で利用されているのかの確認が
重要かと思ったからです。

たとえば、Webサーバ側からのHTTP応答ヘッダが
  HTTP/1.1 200 OK
ではなく、
  HTTP/1.1 304 Not Modified
などで返されるのであれば、ブラウザからの If-Modified-Since の
送信を止めるようにするか、もしくは、サーバ側でこのHTTP要求ヘッダを
無視して、常に最新の情報を返すようにしなければならないでしょうし、
そもそも、Webサーバとの通信自体が行われていないようであれば、
ブラウザ内部(あるいはOS側)のキャッシュが使われないような手法を
探す必要がありますよね。

> 間違っているかも!?
Perl側の知識は無いので、この辺はなんとも。

> お教えいただいたサンプルを見ながら勉強させていただきます。
WebBrowserコントロールの仕様などについては、ほとんどが
下記のサイトに書かれています。
http://msdn.microsoft.com/library/en-us/dnanchor/html/anch_webdev.asp

コントロール自身の仕様に付いては、上記の
 [Web Development]
   [Programming and Reusing the Browser]
     [WebBrowser Control]
の項を。

その内部に表示されるHTMLの動作仕様に関しては、
 [Web Development]
   [HTML and Dynamic HTML]
     [HTML and DHTML Reference ]
の項を参照してみてください。

また、「Web & Internet Samples」にあるサンプル集も参考になるでしょう。
http://msdn.microsoft.com/archive/en-us/samples/internet/welcome.asp


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

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






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