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");
}
}
