WebBrowserControlで通信をキャプチャしたい

タグの編集
投稿者 まだまだ  (社会人) 投稿日時 2024/11/4 00:56:51
WebBrowserConrolを使用してウェブページを表示する際、ウェブページのURLはNavigatingイベントやUrlプロパティなどで容易に取得可能ですが、
各ページを表示する際に発生する通信
(例えば、HTMLから呼び出されるimgファイルやjsファイル、JavaScriptによって読み込まれる各種ファイルなど)のURLをキャプチャすることは可能なのでしょうか。
(ChromeやFirefoxなどの開発ツールのネットワークタブから確認できるような内容のイメージです。)
可能であれば、その取得方法をご教授いただけないでしょうか。
どうぞよろしくお願いいたします。
投稿者 KOZ  (社会人) 投稿日時 2024/11/4 11:20:14
IE で表示できないコンテンツが増えてきたので、nuget で Microsoft.Web.WebView2 を取得し WebView2 を使ったほうがいいと思います。
WebResourceResponseReceived イベントで関連ファイルの URL をキャプチャすることが出来ますし、ファイルの中身を読み込むこともできます。
下の例は、このページに含まれる .js ファイルの中身を表示するプログラムです。

Imports System.IO
Imports Microsoft.Web.WebView2.Core

Public Class Form1

    Private WithEvents coreWebView As CoreWebView2

    Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Await WebView21.EnsureCoreWebView2Async()
        coreWebView = WebView21.CoreWebView2
        coreWebView.Navigate("https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30992")
    End Sub

    Private Async Sub CoreWebView_WebResourceResponseReceived(sender As Object,
                        e As CoreWebView2WebResourceResponseReceivedEventArgs) _
                        Handles coreWebView.WebResourceResponseReceived
        Dim uri = New Uri(e.Request.Uri)
        If uri.AbsolutePath.EndsWith(".js", StringComparison.OrdinalIgnoreCase) Then
            Dim stream = Await e.Response.GetContentAsync()
            Using reader = New StreamReader(stream)
                Debug.WriteLine($"{reader.ReadToEnd()}")
            End Using
        End If
    End Sub

End Class

投稿者 まだまだ  (社会人) 投稿日時 2024/11/5 00:47:02
KOZさん、早速ご回答ありがとうございます!
IEベースのWebBrowserControlしか知りませんでしたが、EdgeベースのWebView2なるものがあるのですね、大変勉強になりました。
早速WebView2コンポーネントを入れてみたところ、ご呈示のようなコードで無事ページ関連ファイルのURLをキャプチャすることができました。
ありがとうございました!