拦截响应
如果在WebResourceRequested事件设置了e参数的Response属性,此时WebViewer不再访问服务器,直接直接将设置的Response作为本次请求的资源显示在浏览器中。
例如在WebResourceRequested事件设置代码:
Dim
wv
As
WebViewer = e.Sender.WebViewer
If
e.Request.Uri =
"http://www.foxtable.com/login"
Then
Dim
html
As
String
=
"<h1>Login Success</h1>"
'
Dim
stream
As
New
MemoryStream(Encoding.UTF8.GetBytes(html))
Dim
responseHeaders
As
String
=
"Content-Type: text/html; charset=utf-8"
& vbCrLf &
"Set-Cookie: session_id=xyz789; Path=/; HttpOnly; Secure"
& vbCrLf
e.Response = wv.CoreWebView2.Environment.CreateWebResourceResponse( stream,
200,
"OK",
responseHeaders)
End
If
此时在地址框输入网址:
http://www.foxtable.com/login
会显示内容:
你可能觉得在WebResourceRequested拦截响应意义不大,因为你可以
在NavigationStarting事件用更方便的方式实现上面的效果。
其实二者有本质区别,NavigationStarting只会针对主文档触发执行一次,而WebResourceRequested会针对主文档以及主文档中的所有资源(包括图片、css和js脚本等等)各自触发一次,可以进行更精细的拦截,后面会介绍更多的例子。
需要注意的是:
1、WebViewer并没有真正访问网址http://www.foxtable.com/login,实际上也不存在这个网址,所以网址可以"瞎编"。
2、既然网址可以"瞎编",所以你可以不用http,直接来一个自定义的协议"custom://login"也完全可行,后面的拦截示例基本都用这种自定义的协议。
3、合成响应头的时候(responseHeaders),代码中的vbCrLf不能省略,因为http协议规定
每个响应头字段之间用vbCrLf分割,也就是说每个响应头单独一行。
4、CreateWebResourceResponse的语法为:
CreateWebResourceResponse(content, statusCode, reasonPhrase, headers)
参数
说明
contentStream类型,包含响应内容的流
statusCode
整数型,Http代码,常用值有:
reasonPhrase
字符串型,状态码对应的描述短语,例如:
headers
字符串型,HTTP响应头字符串,每行一个响应头,格式为
"Header-Name: Header-Value\r\n"
本页地址:http://www.foxtable.com/webhelp/topics/6218.htm