DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WebBrowserで最新のページを表示したい

環境/言語:[Visual C# 2005, Windows XP, .NET Framework 2.0]
分類:[.NET]

お久しぶりです。 masaと申します。
現在WebBrowserコントロールを使用しウェブブラウザを作っているのですが、
一部のサイトにて、IEでは更新されるのに自作ブラウザでは更新されないサイトが出てきました。
説明するよりも見ていただいた方が早いと思いますので、状態を再現するコードを書いてみました。geocitiesのアカウントを持っている方がいらっしゃったら試していただけると幸いです。
(実際に作るコードとは関係ありません)

WebClient wc = new WebClient();
// user、passは環境に合わせて置き換えてください。
string user = "user";
string pass = "pass";
wc.Credentials = new NetworkCredential(user, pass);

WebBrowser wb = new WebBrowser();

CDO.MessageClass msg = new CDO.MessageClass();

// メインルーチン
while (true)
{
// mhtで保存する
msg.CreateMHTMLBody(Console.ReadLine(), CDO.CdoMHTMLFlags.cdoSuppressNone, "", "");
ADODB.Stream st = msg.GetStream();
st.SaveToFile("C:\\test.mht", ADODB.SaveOptionsEnum.adSaveCreateOverWrite);
st.Close();

// アップロードする(geocities)
wc.UploadFile("ftp://ftp.geocities.jp/test.mht", "C:\\test.mht");

// ブラウザでページを開く
wb.Navigate("http://www.geocities.jp/" + user + "/test.mht");

// ページが表示されるまで待つ
while (wb.IsBusy || wb.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}

// 現在表示してるページのタイトルを表示
Console.WriteLine("Title: " + wb.DocumentTitle);
}

・Microsoft CDO for Windows 2000 Library
・Microsoft ActiveX Data Objects 2.8 Library
・System.Windows.Forms
を参照に追加しています。

実行し、「http://www.yahoo.co.jp/」と打ち込むと「Title: Yahoo! JAPAN」と出てきてほしいのに「Title: 」と返ってきました。
次に「http://www.google.co.jp/」と打ち込むと「Title: Google」と出てほしいのに「Title: Yahoo! JAPAN」と返ってきて、それ以降どのURLを指定しても「Title: Yahoo! JAPAN」が返ってきます…
上手くアップロードできていないのかと思い、ブラウザでアップロードした先を表示すると、ちゃんと最後に打ち込んだサイトのmhtが表示されます。

恐らくキャッシュが使用されているためにこのようなことが起きてしまうのだと思いますが、どうしたら最新のページを開けるでしょうか?
wb.Refresh()やwb.Refresh(WebBrowserRefreshOption.Completely)を行っても効果はありませんでした。

どなたか分かる方がいらっしゃいましたら回答お願いします。
WebBrowserコントロールで最新のページを表示することはできない、ということでしょうか?
■No31127に返信(masaさんの記事)
> WebBrowserコントロールで最新のページを表示することはできない、ということでしょうか?

アップロード直後にNavigateしても反映されるものなのでしょうか?
WebBrowser上にはNavigateしたサイトは表示されているのでしょうか?
あと、

> while (wb.IsBusy || wb.ReadyState != WebBrowserReadyState.Complete)

をすぐ抜けてしまっていたりしていないでしょうか?
(例えばWebBrowserの初期化やロードが始まる前にwhileを抜けてしまっているとか)
ヴァンさん、ズッカさん回答ありがとうございます!

whileから抜けているような動作はないようです。
また、アップロードから数分経過したところでwb.Refresh(WebBrowserRefreshOption.Completely)をやってから
タイトルを取得しても以前のものが表示されます...

そのページをIEで開くと最新ものが表示されます。IEでも更新されていない時がありますが、F5で最新のものが取得されます。
しかし自作ソフト側はソフトを再起動しない限り以前のページしか表示されません。
他のページを探しても該当するようなものはあまり見つかりませんでした…

WebBrowserコントロールはIEとは同じではないので、
最新のページを表示できない、という結論でよろしいでしょうか?

なんか納得がいきませんが…
■No31139に返信(masaさんの記事)
> 他のページを探しても該当するようなものはあまり見つかりませんでした…
>
> WebBrowserコントロールはIEとは同じではないので、
> 最新のページを表示できない、という結論でよろしいでしょうか?
>
> なんか納得がいきませんが…

実験的に upload とブラウザ部を別プログラムに実行してみはどうでしょうか?
> WebBrowser上にはNavigateしたサイトは表示されているのでしょうか?

この質問についてはどうでしょうか?
もしかしたら、コードにあるこのWebBrowser

> WebBrowser wb = new WebBrowser();

は、フォーム上に配置されていないため、Navigateしたサイトが表示されているかどうかを視覚的に確認できていないのかもしれません。
そうであれば、一度、フォーム上にこのWebBrowserを配置し、Navigateが正しく行われているかを視覚的に確認してみてはどうでしょうか。

あと、拡張子が".mht"でなく、".html"のようなオーソドックスなHTMLファイルだとどうでしょうか?
返信に時間がかかってしまい、すみませんでした…

WebBrowserを見えるようにしてみましたが前のページが表示されます。
また、htmでも結果は変わりませんでした。

もう一つ実験をしてみたのですが下の結果でした。
Form1で「サイトA」アップロード作業

Form2でページ表示

「サイトA」が表示される

Form2を閉じる

Form1で「サイトB」アップロード作業

Form2でページ表示

「サイトA」が表示される

Form2で右クリック、最新の情報に更新

「サイトA」が再読み込みされる

IEでアップロード先を開く

「サイトB」が表示される

Form2で右クリック、最新の情報に更新

「サイトA」が表示される

このようにIEでは最新のページが表示できるのにもかかわらず、
自作ソフト側だと前のページが表示されます。
Form2上にWebBrowserが乗っているので、Form2を閉じる→Form2でサイト表示の段階で
新しいWebBrowserになっているはずなのに…

どなたかもう少しお付き合いいただけると幸いです。
「サイトA」「サイトB」とありますが、「サイトA」も「サイトB」もURLは同じなのですよね?
つまり、「サイトB」というファイルでアップ済みの「サイトA」のファイルを上書きしているのですよね?
(「サイトA」「サイトB」と書かれていると、ふつうはこれらが別URLであるように解釈しますので気をつけましょう。これらが別URLならば、WebBrowserを何度リロードしてもサイトBが表示されないのは当然のことなのですから。)
4649さん、ご指摘ありがとうございます。
その通りです。「サイトA」、「サイトB」の内容が同一URLにアップロードされているということです。

ちなみに1回ソフトを終了し、もう一度起動すると最後の内容(上の例では「サイトB」の内容)が表示されます。

DOBON.NET | プログラミング道 | プログラミング掲示板