WebView2 応用テクニック

レスポンスの内容を変更する

WebView2からのリクエストを行った場合に、サーバからの実際のレスポンス内容ではなく、任意に設定した内容で受け取ることができます。

まずはCoreWebView2InitializationCompletedイベントハンドラにメソッドを追加します。
WebView2の初期化が完了したときに発生するイベントです。

//C#
private void Request_Load(object sender, EventArgs e)
{
    webView2.CoreWebView2InitializationCompleted += webView2CoreWebView2InitializationCompleted;
}

追加したメソッド内で以下の処理を行います。
・リクエストが発生した場合に処理を行うために、WebResourceRequestedイベントハンドラにメソッドを追加します。
WebResourceRequestedイベントを発生させるための条件として、URL/コンテキストの種類を指定できます。
//C#
private void webView2CoreWebView2InitializationCompleted(object sender, EventArgs e)
{
    webView2.CoreWebView2.AddWebResourceRequestedFilter("*", Microsoft.Web.WebView2.Core.CoreWebView2WebResourceContext.All);
    webView2.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
}

URL部分には、一致する文字列の指定だけではなく、ワイルドカードとして「*」や「?」を含めることができます。
コンテキスト部分は、すべてを対象とするならAllを指定しますが、画像ならImage、スタイルシートならStylesheetなど、個別に指定することもできます。
詳しい値は下記の参考リンクをみてください。

WebResourceRequestedイベントで実行されるメソッドには、リクエストで返却するデータを作成します。
第二引数のe.Responseに作成した値を設定します。
//C#
private void CoreWebView2_WebResourceRequested(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebResourceRequestedEventArgs e)
{
    e.Response = webView2.CoreWebView2.Environment.CreateWebResourceResponse(
        Content: new System.IO.MemoryStream(Encoding.UTF8.GetBytes($"<html><body><div>WebView2 resoponse test</div><</body></html>")),
        StatusCode: 200,
        ReasonPhrase: "OK",
        Headers: $"Content-Type: text/html, X-Hello:World");
}

サンプル

						Public Class Response

							Private Sub Response_Load(sender As Object, e As EventArgs) Handles MyBase.Load
								InitializeAsync()
								AddHandler webView2.CoreWebView2InitializationCompleted, AddressOf webView2CoreWebView2InitializationCompleted
							End Sub
						
							Private Async Sub InitializeAsync()
								Await webView2.EnsureCoreWebView2Async(Nothing)
							End Sub
						
							Private Sub webView2CoreWebView2InitializationCompleted(sender As Object, e As EventArgs)
						
								webView2.CoreWebView2.AddWebResourceRequestedFilter("*", Microsoft.Web.WebView2.Core.CoreWebView2WebResourceContext.All)
								AddHandler webView2.CoreWebView2.WebResourceRequested, AddressOf CoreWebView2_WebResourceRequested
						
							End Sub
						
							Private Sub CoreWebView2_WebResourceRequested(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2WebResourceRequestedEventArgs)
						
								Dim uriString = e.Request.Uri
						
								e.Response = webView2.CoreWebView2.Environment.CreateWebResourceResponse(
										Content:=New System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes($"
Hello, WebView2!
")), StatusCode:=200, ReasonPhrase:="OK", Headers:=$"Content-Type: text/html, X-Hello:World") End Sub Private Sub btnWVOpen_Click(sender As Object, e As EventArgs) Handles btnWVOpen.Click If webView2.CoreWebView2 Is Nothing Then Return webView2.CoreWebView2.Navigate("https://web.biz-prog.net/test/testpage.html") End Sub End Class
						public partial class Form1 : Form
						{
							public Form1()
							{
								InitializeComponent();
							}
					
							private void Form1_Load(object sender, EventArgs e)
							{
								InitializeAsync();
								webView2.CoreWebView2InitializationCompleted += webView2CoreWebView2InitializationCompleted;
							}
					
							private async void InitializeAsync()
							{
								await webView2.EnsureCoreWebView2Async(null);
							}

							private void webView2CoreWebView2InitializationCompleted(object sender, EventArgs e)
							{
								webView2.CoreWebView2.AddWebResourceRequestedFilter("*", Microsoft.Web.WebView2.Core.CoreWebView2WebResourceContext.All);
								webView2.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
							}
					
							private void CoreWebView2_WebResourceRequested(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebResourceRequestedEventArgs e)
							{
								var uriString = e.Request.Uri;
					
								e.Response = webView2.CoreWebView2.Environment.CreateWebResourceResponse(
									Content: new System.IO.MemoryStream(Encoding.UTF8.GetBytes($"<html><body><div>WebView2 resoponse test</div><</body></html>")),
									StatusCode: 200,
									ReasonPhrase: "OK",
									Headers: $"Content-Type: text/html, X-Hello:World");
							}

							private void btnWVOpen_Click(object sender, EventArgs e)
							{
								if (webView2.CoreWebView2 == null)
								{
									MessageBox.Show("err");
									return;
								}
					
								webView2.CoreWebView2.Navigate("https://web.biz-prog.net/test/testpage.html");
							}
						}
					

参考