Microsoft Edge WebView2 控制項可讓您與網路要求互動並修改網路要求。 您可以使用 and WebResourceResponseReceived 事件提供WebResourceRequested回應或修改網路要求。
您可以使用方法 NavigateWithWebResourceRequest 瀏覽通過特定網路要求。
詳細內容:
- 簡介
- 何時使用自訂與基本方法
- 攔截要求,以監視或修改要求
- 覆寫回應,主動取代回應
- 建構自訂要求並使用該要求進行瀏覽
- 透過 WebResourceResponseReceived 事件監視要求和回應
- API 參考概觀
- 另請參閱
簡介
Microsoft Edge WebView2 控制項可讓您與網路要求互動並修改網路要求。 您可以使用 and WebResourceResponseReceived 事件提供WebResourceRequested回應或修改網路要求。
您可以使用方法 NavigateWithWebResourceRequest 瀏覽通過特定網路要求。
您可以修改網路要求,如下所述。 使用方法來 NavigateWithWebResourceRequest :
將本機檔案內容上傳至您的應用程式,以新增離線功能的支援。
封鎖網頁中的內容,例如特定影像。
微調特定頁面的驗證。
術語:
| 術語 | 定義 |
|---|---|
| 攔截 | 您的主應用程式可以攔截從 WebView2 控制項傳送到 HTTP 伺服器的要求、讀取或修改要求,然後將未變更或修改過的要求傳送至 HTTP 伺服器 (或本機程式碼,而不是 HTTP 伺服器) 。 |
| 覆寫 | 您的主應用程式可以覆寫從 HTTP 伺服器傳送到 WebView2 控制項的回應,並將自訂回應傳送到 WebView2 控制項,而不是原始回應。 |
何時使用自訂與基本方法
事件 WebResourceRequested 是低階 API,可提供更多控制權,但需要更多程式碼,使用起來也很複雜。 針對某些常見案例,我們提供的 API 更易於使用且針對這些特定案例進行最佳化,建議您使用這些 API,而非本文所述的 API。
在可行時,最好使用這些其他方法,而不是使用 WebResourceRequested API:
- 基本驗證
- 一般瀏覽
- 在 WebView2 中管理 Cookie
- 設定使用者代理程式字串。 請參閱 UserAgent 屬性。
注意: 若為具有虛擬主機名稱的 URL,不支援使用 WebResourceRequested 事件。 這是因為 WebResourceRequested 事件並未針對 SetVirtualHostNameToFolderMapping 方法觸發。
主應用程式、WebView2 控制項和 HTTP 伺服器如何互動
WebView2 控制項位於主機應用程式與 HTTP 伺服器之間。 當您的主應用程式瀏覽至 URI 時,WebView2 控制項會傳送要求至 HTTP 伺服器。 然後 HTTP 伺服器會傳送回應至 WebView2 控制項。
攔截要求,以監視或修改要求
您的主應用程式可以 攔截 從 WebView2 控制項傳送到 HTTP 伺服器的要求、讀取或修改要求,然後將未變更或修改過的要求傳送至 HTTP 伺服器 (或本機程式碼,而不是 HTTP 伺服器) 。
攔截要求可讓您自訂標頭內容、URL 或 GET/POST 方法。 主應用程式可能會想要攔截要求,以提供選用的 POST 內容做為要求的一部分。
主應用程式可以使用此 API 變更要求的屬性:
您可以使用頁首執行的動作
HTTP 標頭提供有關要求或回應的重要資訊和中繼資料。 變更 標頭 可讓您在網路上執行功能強大的動作。
要求標頭可用來指示回應 (的格式,例如Accept-*標頭) 、設定驗證權杖、讀取和寫入 Cookie (敏感性資訊) 、修改使用者代理程式等等。
回應標頭可用來提供更多回應內容。
根據 URL 和資源類型篩選 WebResourceRequested 事件
若要接收 WebResourceRequested 事件,請根據 URL 和資源類型,指定主應用程式感興趣之要求的篩選條件。
例如,假設主應用程式正在嘗試取代影像。 在此情況下,主應用程式只對 WebResourceRequested 影像的事件感興趣。 主應用程式只會透過指定 resourceContext 影像的篩選來取得影像的事件。
另一個範例是,如果主應用程式只對像 .https://example.com 然後應用程式可以指定 URL 篩選,以 https://example.com/* 取得與該網站相關聯的事件。
如需 URL 篩選運作方式的詳細資訊,請參閱 CoreWebView2.AddWebResourceRequestedFilter 方法 > 備註
為什麼要攔截從 WebView2 傳送的要求?
攔截從 WebView2 傳送的要求可讓您進一步設定您的要求。 主應用程式可能會想要提供選用內容,做為 WebView2 控制項自行無法知道的要求的一部分。 一些案例包括:
- 您正在登入頁面,且應用程式具有認證,因此應用程式可以提供驗證標頭,而使用者不需要輸入這些認證。
- 您想要在應用程式中具有離線功能,以便在偵測不到網際網路連線時將 URL 重新導向至本機檔案路徑。
- 您想要透過 POST 要求將本機檔案內容上傳到要求伺服器。
修改要求的順序
- 主應用程式設定
WebResourceRequested篩選。 - 主應用程式會定義 和
WebResourceResponseReceived的WebResourceRequested事件處理常式。 - 主應用程式會將 WebView2 控制項瀏覽至網頁。
- WebView2 控制項會建立網頁所需資源的要求。
- WebView2 控制項會
WebResourceRequested向主應用程式觸發事件。 - 主應用程式會接聽並處理
WebResourceRequested事件。 - 主應用程式此時可以修改標頭。 主應用程式也可以延遲
WebResourceRequested事件,這表示主應用程式會要求更多時間來決定要執行的動作。 - WebView2 網路堆疊可以新增更多標頭 (例如,可以) 新增 Cookie 和授權標頭。
- WebView2 控制項會將要求傳送至 HTTP 伺服器。
- HTTP 伺服器會傳送回應至 WebView2 控制項。
- WebView2 控制項會
WebResourceResponseReceived引發事件。 - 主應用程式會接聽事件並
WebResourceResponseReceived處理它。
範例:攔截要求,以監視或修改要求
在下列範例中,主應用程式會 攔截 從 WebView2 控制項傳送到 http://www.example.com HTTP 伺服器的文件要求、新增自訂標頭值,然後傳送要求。
// Add a filter to select all resource types under http://www.example.com
webView.CoreWebView2.AddWebResourceRequestedFilter(
"http://www.example.com/*", CoreWebView2WebResourceContext.All);
webView.CoreWebView2.WebResourceRequested += delegate (
object sender, CoreWebView2WebResourceRequestedEventArgs args) {
CoreWebView2WebResourceContext resourceContext = args.ResourceContext;
// Only intercept the document resources
if (resourceContext != CoreWebView2WebResourceContext.Document)
{
return;
}
CoreWebView2HttpRequestHeaders requestHeaders = args.Request.Headers;
requestHeaders.SetHeader("Custom", "Value");
};
覆寫回應,主動取代回應
根據預設,HTTP 伺服器會傳送回應至 WebView2 控制項。 您的主應用程式可以 覆寫 從 HTTP 伺服器傳送到 WebView2 控制項的回應,並將自訂回應傳送到 WebView2 控制項,而不是原始回應。
覆寫回應的順序
- 主應用程式設定
WebResourceRequested篩選。 - 主應用程式會定義 和
WebResourceResponseReceived的WebResourceRequested事件處理常式。 - 主應用程式會將 WebView2 控制項瀏覽至網頁。
- WebView2 控制項會建立網頁所需資源的要求。
- WebView2 控制項會
WebResourceRequested向主應用程式觸發事件。 - 主應用程式會接聽並處理
WebResourceRequested事件。 - 主應用程式會設定
WebResourceRequested回應給事件處理常式。 主應用程式也可以延遲WebResourceRequested事件,這表示主應用程式會要求更多時間來決定要執行的動作。 - WebView2 控制項會將回應轉譯為資源。
範例:覆寫回應,以主動取代它
// Add a filter to select all image resources
webView.CoreWebView2.AddWebResourceRequestedFilter(
"*", CoreWebView2WebResourceContext.Image);
webView.CoreWebView2.WebResourceRequested += delegate (
object sender, CoreWebView2WebResourceRequestedEventArgs args) {
// Replace the remote image resource with a local one specified at the path customImagePath.
// If response is not set, the request will continue as it is.
FileStream fs = File.Open(customImagePath, FileMode.Open);
CoreWebView2WebResourceResponse response = webView.CoreWebView2.Environment.CreateWebResourceResponse(fs, 200, "OK", "Content-Type: image/jpeg");
args.Response = response;
};
建構自訂要求並使用該要求進行瀏覽
此 NavigateWithWebResourceRequest 方法可讓主應用程式使用自訂 WebResourceRequest. 您可以使用此 API 來建立具有自訂標頭和內容的 GET 或 POST 要求。 然後 WebView2 控制項將會使用此自訂要求進行瀏覽。
範例:建構自訂要求並使用該要求進行瀏覽
// This code posts text input=Hello to the POST form page in W3Schools.
// Need to convert post data to UTF-8 as required by the application/x-www-form-urlencoded Content-Type
UTF8Encoding utfEncoding = new UTF8Encoding();
byte[] postData = utfEncoding.GetBytes("input=Hello");
MemoryStream postDataStream = new MemoryStream(postData.Length);
postDataStream.Write(postData, 0, postData.Length);
postDataStream.Seek(0, SeekOrigin.Begin);
// This acts as a HTML form submit to https://www.w3schools.com/action_page.php
CoreWebView2WebResourceRequest webResourceRequest =
environment.CreateWebResourceRequest("https://www.w3schools.com/action_page.php",
"POST",
postDataStream,
"Content-Type: application/x-www-form-urlencoded");
webView.CoreWebView2.NavigateWithWebResourceRequest(webResourceRequest);
透過 WebResourceResponseReceived 事件監視要求和回應
您可以透過 WebResourceResponseReceived 事件監視要求和回應,以讀取任何標頭值。
範例:透過 WebResourceResponseReceived 事件監視要求和回應
此範例顯示如何透過事件監視 WebResourceResponseReceived 要求和回應來讀取授權標頭值。
下列程式碼示範 WebResourceResponseReceived 如何使用此事件。
WebView.CoreWebView2.WebResourceResponseReceived += CoreWebView2_WebResourceResponseReceived;
// Note: modifications made to request are set but have no effect on WebView processing it.
private async void WebView_WebResourceResponseReceived(object sender, CoreWebView2WebResourceResponseReceivedEventArgs e)
{
// Actual headers sent with request
foreach (var current in e.Request.Headers)
{
Console.WriteLine(current);
}
// Headers in response received
foreach (var current in e.Response.Headers)
{
Console.WriteLine(current);
}
// Status code from response received
int status = e.Response.StatusCode;
if (status == 200)
{
Console.WriteLine("Request succeeded!");
// Get response body
try
{
System.IO.Stream content = await e.Response.GetContentAsync();
// Null will be returned if no content was found for the response.
if (content != null)
{
DoSomethingWithResponseContent(content);
}
}
catch (COMException ex)
{
// A COMException will be thrown if the content failed to load.
}
}
}
API 參考概觀
要求:
- CoreWebView2.AddWebResourceRequestedFilter 方法
- CoreWebView2.NavigateWithWebResourceRequest 方法
- CoreWebView2.RemoveWebResourceRequestedFilter 方法
- CoreWebView2.WebResourceRequested 事件
- CoreWebView2Environment.CreateWebResourceRequest 方法
- CoreWebView2WebResourceContext 列舉
-
CoreWebView2WebResourceRequest 類別
ContentHeadersMethodUri
-
CoreWebView2WebResourceRequestedEventArgs 類別
RequestResourceContextResponseGetDeferral
回應:
- CoreWebView2.WebResourceResponseReceived 事件
- CoreWebView2Environment.CreateWebResourceResponse 方法
-
CoreWebView2WebResourceResponse 類別
ContentHeadersReasonPhraseStatusCode
-
CoreWebView2WebResourceResponseReceivedEventArgs 類別
RequestResponse
-
CoreWebView2WebResourceResponseView 類別
HeadersReasonPhraseStatusCodeGetContentAsync
另請參閱
- 從網頁端程式碼呼叫原生端程式碼
- WebView2 API 概觀中的 Web/原生互通性。