いつも参考にさせていただいています。
表記の通りなんですが以下のようにおよそ10分おきにアクセスしています。
(バナー広告の自動クリックとかじゃないですよ(T_T))
(注:テスト時はテストサーバに60秒おきに送信しています)
アクセスしている部分 → WebBrowser1.Navigate (strURLbuf)
しかし、何時間放置しても更新されません。(初回取得時のみ正常稼動)
受け取り側はperlで書いていますがアクセスされた形跡もありません。また、perl側でもキャッシュされないように処理しています。
WebBrowserを通常隠していますが表示して確認しています。
このとき、右クリックして最新の情報にしたりすると、きちんとアクセスしてくれます。普通にIEとかでアクセスするとこれまたきちんとした結果を返してきます。
・perl側で、データの有効期限も付け加えたほうがいいのでしょうか?
・WebBrowser(inetとか)などで対応できるのでしょうか?
・WebBrowserに擬似的にキーを送ったほうがいいのでしょうか(Ctrl+F5とか)
お助けください。お願いします。
一応、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 メソッドがあります。
魔界の仮面弁士さん ありがとうございます。できました。
ちょっと姑息な手段ですが・・・以下のようにしました
WebBrowser1.Navigate2 (strURLbuf & "&" & Format(Now(), "YYYYMMDDHHNNSS"))
毎回違うアドレスという認識なのかこれならうまく動きます。
>現在の所、サーバー側から返される HTTP応答ヘッダからは、
>どのような結果が返されてくるようになってているのでしょうか?
現在はCGI側でHTML(タグなし)を作成し、それを返しています。
正常な通信かどうかはHTMLのコードを解析しています。
たとえばエラーなら"-1:SystemError"のような返答が帰ってきます。
…あまり良くないですが、このプログラムは送り続けることに意味があるものなので、現在はこれでヨシとしちゃっています。
>コンポーネントによっては、キャッシュを使わずに読み込ませる。。。
>お望みの動作に近い物としては、Refresh2 メソッドがあります。
これは非常に参考になりました。あとで勉強してみます。
refresh2はどのような結果になるのかわからないのですが、もしブラウザの再読み込みと同じなら今回は誤動作してしまう可能性があるので利用できません。(HTTPリクエストの再要求になっちゃうとまずいので)
表題の件、解決しました。ありがとうございました!
もし、教えていただけるなら、後一点。
WebBrowser1.Navigate
WebBrowser1.Navigate2
この違いってなんですか??
同じような動作をするのでいまいち区別がつきません。
#それにしてもWebBrowserについては検索してもなかなか出てこないものですね。。。余り使われないのかな??
>> 現在の所、サーバー側から返される 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については検索してもなかなか出てこないものですね
海外にも目を向けてみると、比較的多くの資料が見つかるかと思いますよ。
魔界の仮面弁士さん ありがとうございます。
ヘッダ部分は現在いじってないので、書いていただいたとおりだと思います。
(基本的にサーバーが付加するもののみ)
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当時は存在しなかったメソッドですね。
そうだったのですか。知りませんでした。
お教えいただいたサンプルを見ながら勉強させていただきます。
また、海外にも目を向けて探してみたいと思います。
> ヘッダ部分は現在いじってないので、書いていただいたとおりだと思います。
いや、もっといろいろなヘッダが付属しているはずだと思いますが…。
たとえば、フリーソフトの「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
ツイート | ![]() |