WebResourceResponseReceived

一般用户可以忽略本节内容

WebResourceResponseReceived事件在WebViewer接收到网页资源(如 HTML、CSS、JS、图片、接口请求等)的响应后立即触发。

该事件无法改变最终结果,它只是一个"只读"的观察者,主要用于解析响应头,所以较少使用。

e参数属性

属性名称 数据类型 核心说明
Request CoreWebView2WebResourceRequest 返回待发送的网络请求对象,可重定向请求、添加自定义请求头、修改 POST 数据、变更请求方法(GET→POST)

其属性有:

Uri: 请求的 URL(可修改重定向)
Method: 请求方法(GET/POST/PUT 等)
Headers: 请求头集合
Content: POST 请求的正文(流)
Response CoreWebView2WebResourceResponseView 获取资源的响应信息(状态码、响应头、响应内容等)

其属性有:
StatusCode:(如200/404/500);
ReasonPhrase:状态描述文本

GetContentAsync:一个异步方法,用于获得包含响应内容的流。

在解析响应头的时候,一定要先判断是否包括指定名称的头,否则会程序会崩溃,例如:

Dim server As String = "default"
If
e.Response.Headers.Contains("server") Then '一定要先判断
    server = e.response.Headers.GetHeader(
"Server")
End
If

此外这是一个异步事件,事件中的代码不在主线程中执行,所以该事件中除解析响应头之外的代码,特别是更新界面(UI)和写入数据的代码,必须包装在同步方法中执行, 方法很简单,例如:

'异步执行的事件代码
BaseMainForm.Invoke(
Sub()
   
'更新UI的代码
    '数据写入的代码
End Sub)

示例一

解析请求头和响应头参考代码:

'解析请求头
Dim
url As String = e.Request.Uri
Dim
method As String = e.Request.Method
If
e.Request.Headers.Contains("Cookie") Then '请求Cookie
   
Dim cookie As String = e.request.Headers.GetHeader("Cookie")
End
If

'解析响应头
Dim
statusCode As Integer = e.Response.StatusCode
Dim
reasonPhrase As String = e.Response.ReasonPhrase
Dim
contentType As String
If
e.Response.Headers.Contains("Content-Type") Then '内容类型
    contentType = e.response.Headers.GetHeader(
"Content-Type")
End
If
Dim
contentLength As String
If
e.Response.Headers.Contains("Content-Length") Then '内容长度
    contentLength = e.response.Headers.GetHeader(
"Content-Length")
End
If
If
e.response.Headers.Contains("Set-Cookie") Then '响应Cookie
   
Dim setCookie = e.response.Headers.GetHeader("Set-Cookie")
End
If
Dim
server As String = "default"
If
e.Response.Headers.Contains("server") Then
    server = e.response.Headers.GetHeader(
"Server")
End
If

'其他代码用同步方式执行
If
statusCode >= 400 Then
    BaseMainForm.Invoke(
Sub()
        MessageBox.Show(
"资源加载失败,URL:" & url, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
       
'''普通代码
   
End Sub)
End
If

示例二

假定对于某些响应内容,希望除了在WebViewer中显示外,还需要在数据库中做个备份,可以参考下面的代码:

'''Async
Dim
url As String = e.Request.Uri
If
url = "链接地址" Then '如果是约定的链接
   
If e.Response.StatusCode = 200 Then '如果响应成功
       
Dim cntType As String
       
If e.Response.Headers.Contains("Content-Type") Then
            cntType = e.Response.Headers.GetHeader(
"Content-Type")
       
End If
       
If cntType = "application/json" Then '如果收到的是json字符串
           
Dim stream As Stream = Await e.Response.GetContentAsync() '异步获取响应流,记得加Await
           
Dim reader As New StreamReader(stream) '定义字符读取器
           
Dim text = Await reader.ReadToEndAsync() '异步读取字符串,记得加Await
           
Dim jo As JObject = JsonConvert.DeserializeObject(text) '解析json
           
'有关数据和界面的操作,必须采用同步方式执行:
            BaseMainForm.Invoke(
Sub()
               
Dim dr As DataRow = DataTables("A").AddNew()
                dr(
"第一列") = jo("名称1")
                dr(
"第二列") = jo("名称2")
                dr(
"第三列") = jo("名称3")
           
End Sub)
       
End If
   
End If
End
If

提示:这里用json做例子,如果是网页,在NavigationCompleted事件中获得网页底层DOM对象,然后读取相关内容更方便。


本页地址:http://www.foxtable.com/webhelp/topics/6224.htm