拦截响应

如果在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

会显示内容:

Login Success

你可能觉得在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)
参数 说明
content Stream类型,包含响应内容的流
statusCode 整数型,Http代码,常用值有:
  • 200: OK (成功)
  • 404: Not Found (未找到)
  • 500: Internal Server Error (服务器错误)
reasonPhrase 字符串型,状态码对应的描述短语,例如:
  • "OK"
  • "Not Found"
  • "Internal Server Error"
headers 字符串型,HTTP响应头字符串,每行一个响应头,格式为 "Header-Name: Header-Value\r\n"


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