WebView2 応用テクニック
レスポンスの内容を変更する
WebView2からのリクエストを行った場合に、サーバからの実際のレスポンス内容ではなく、任意に設定した内容で受け取ることができます。
まずはCoreWebView2InitializationCompleted
イベントハンドラにメソッドを追加します。
WebView2の初期化が完了したときに発生するイベントです。
//C#
private void Request_Load(object sender, EventArgs e)
{
webView2.CoreWebView2InitializationCompleted += webView2CoreWebView2InitializationCompleted;
}
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;
}
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");
}
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"); } }