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对象,然后读取相关内容更方便。