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

WebBrowser のナビゲーションの失敗のハンドリング

環境/言語:[C#.Net、Framework2.0、Win2003srv、XP]
分類:[.NET]

あるPDFファイルを開こうとすると、
たまに「ページを表示できません」のページを開くのですが、
原因がわかりません。

WebBrowser のナビゲーションで失敗しているのだろうと推測しています。
失敗しても成功してもDocumentCompletedが呼ばれているみたいなのですが、
失敗した場合(エラーになった場合)、
そのエラーになった理由をどこかでハンドリングできませんでしょうか。
ログ(コンソール)にでも出力したいです。

どうかどうかよろしくお願いします。
http://homepage1.nifty.com/yito/anhttpd/ie-message.html
例えばここなど。
表示できません、だと大抵は 5xx 、更に言えばサーバがあっぷあっぷですいませんエラーでしょう。

System.Windows.Forms.WebBrowser は NavigateError イベントをサポートしていないんですよねぇ。
・SHDocVw.dll を参照し、WebBrowser.ActiveXInstance を SHDocVw.WebBrowser にキャストして NavigateError イベントを設定する
・イベントシンクを設定する(以下のページが参考になります)
http://homepage1.nifty.com/yasunari/VB/VB2005/WebBrowserNewWindow2Event.htm
// IWebBrowser2 インターフェイスの定義の手が抜かれてますけど。
と言った手段が考えられます。
Webページを使っていただき,ありがとうございます。
NavigateErrorイベントについてはWebBrowser.CreateSinkメソッドのヘルプに
そのもののサンプルがあります。

http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.createsink(VS.80).aspx

> // IWebBrowser2 インターフェイスの定義の手が抜かれてますけど。

COMのインターフェイスは定義の順番も重要だと聞いたのですが,あれで
動いてしまったので,まぁいいかと....
■No18520に返信(YASさんの記事)
> Webページを使っていただき,ありがとうございます。
> NavigateErrorイベントについてはWebBrowser.CreateSinkメソッドのヘルプに
> そのもののサンプルがあります。

は、気付いてませんでした。ご指摘ありがとうございます。
// 日頃人にはドキュメント見ろ読めと言っておきながらこの体たらく……


以下、オフトピックですが。

>>// IWebBrowser2 インターフェイスの定義の手が抜かれてますけど。
> COMのインターフェイスは定義の順番も重要だと聞いたのですが,あれで
> 動いてしまったので,まぁいいかと....
IDispatch 派生のインターフェイスについては dispid、あるいはメソッド名で解決するので定義順は問題ではありません(IUnknown 派生インターフェイスでは問題になります)。
IWebBrowser2 は WebBrowser.ActiveXInstance の COM 型ですが、これが定義されていないよね、と言う話。
WebBrowser.ActiveXInstance が返すのはあくまで Object 型なので、RegisterAsBrowser なんてプロパティは持ってませんよね? VB はレイトバインドを駆使して実行時に解決しちゃいますけど。
ComImport 属性 / Guid 属性などを使って IWebBrowser2 インターフェイス(と RegisterAsBrowser プロパティ)を定義し、それに ActiveXInstance をキャストしてやるのが本来の手法です。

>>NavigateErrorイベントについてはWebBrowser.CreateSinkメソッドのヘルプに
>>そのもののサンプルがあります。

ご教授ありがとうございました!
さっそく実装してみました。
そのままのサンプルは見事に動いてくれました。

けれど・・、
イベントとか作った事ないのでちょっと苦しんでいます。
また、StatusCodeの番号を照らし合わせるにはなにを見ればいいのでしょう。。

テストをしてみてStatusCode=200が返ってくるのを確認できたのですが。。。
エラーメッセージをログへ出力する方法、
もしくはこのサンプルを変更する方法(のおすすめのサイト)はありますか?

どうぞよろしくお願いします。
> また、StatusCodeの番号を照らし合わせるにはなにを見ればいいのでしょう。。
> テストをしてみてStatusCode=200が返ってくるのを確認できたのですが。。。

はいどうぞ。
http://www.nda.co.jp/memo/RFC2068.html

> もしくはこのサンプルを変更する方法(のおすすめのサイト)はありますか?

おすすめサイトというか、大概は自分が気になったときにGoogle先生に聞くとか
普段から基礎知識を吸収しておいて何かあったときに頭の中のインデックスから
拾い上げる、という方法を取りますね。
(上のRFC2068の話も「普段から勉強していたから思い出した」例だと思います)
だからおすすめサイトというのは正直存在しません。
自分的におすすめであっても、誰にでもおすすめできるかどうかはわかりませんし。
Hongliang様

>ComImport 属性 / Guid 属性などを使って IWebBrowser2 インターフェイス(と RegisterAsBrowser プロパティ)を定義し、それに ActiveXInstance をキャストしてやるのが本来の手法です。

教えていただき,ありがとうございます。遅延バインドなのは気になっていました。研究してみます。

スレッドの内容から外れて申し訳ありません。

さらら様

ステータスコードについてはHttpStatusCode列挙体を参考にしたらいかがでしょうか?
http://msdn2.microsoft.com/ja-jp/library/system.net.httpstatuscode(VS.80).aspx
YAS様

> ステータスコードについてはHttpStatusCode列挙体を参考にしたらいかがでしょうか?
> http://msdn2.microsoft.com/ja-jp/library/system.net.httpstatuscode(VS.80).aspx

なるほど。
知識を頂き、ありがとうございました。
こういうクラスがあるという事を認識していかないと駄目ですね。
がんばります。
無事、解決です。
解決済み!

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