异步请求远程资源
一般用户可以忽略本节内容
如果WebResourceRequested事件的内容比较耗时,建议采用异步执行。
本节示例可以参考示例文件"CaseStudy\WebViewer\拦截响应.Table"的窗口"远程图片"。
该示例演示了如何用异步方法读取远程图片,设计步骤:
1、窗口的AfterLoad事件代码:
'''Async
Dim
httpClient
As
New
System.Net.Http.HttpClient()
httpClient.Timeout = TimeSpan.FromSeconds(10)
'设置10秒下载超时
Vars("httpClient")
= httpClient
'保存在Var变量中,方便其他事件调用
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Await
wv.EnsureCoreWebView2Async(Nothing)
'初始化浏览器
'测试网页内容
Dim
html
As
String
=
<![CDATA[
<!DOCTYPE html>
<html>
<head>
<title>远程图片测试</title>
<style>
body { font-family: Arial; padding: 20px; }
.chart-container { margin: 20px 0; }
img { border: 1px solid #ccc; margin: 10px; }
</style>
</head>
<body>
<h2>远程图片测试</h2>
<div class="chart-container">
<h3>饼图</h3>
<img src="custom://chart/pie.png" alt="饼图"
id="pie-chart">
</div>
<div class="chart-container">
<h3>柱状图</h3>
<img src="custom://chart/bar.png" alt="柱状图"
id="bar-chart">
</div>
</body>
</html>
]]>.Value
wv.CoreWebView2.NavigateToString(html)
'导航到测试网页
提示:早期的Foxtable基于.net
framework 2.0开发,那时微软并未提供HttpClient,所以我们自己开发了一个HttpClient,新版本的Foxtable已经升级到.net
framework 4.7.2,可以使用微软内置的HttpClient,为了避免冲突,请使用完整的名称"System.Net.Http.HttpClient"
2、WebResourceRequested事件代码为:
'''Async
Dim
wv
As
WebViewer = e.Sender.WebViewer
Dim
url = e.Request.Uri.ToLower()
Dim
httpClient
As
System.Net.Http.HttpClient = Vars("httpClient")
'获得存储在Var变量中的HttpClient
Dim
deferral
As
CoreWebView2Deferral = e.GetDeferral()'
获取延迟对象,避免WebViewer提前结束事件
Try
If
url.StartsWith("custom://chart/")
Then
'如果是我们"胡编"的图片地址
If
e.ResourceContext = CoreWebView2WebResourceContext.Image
Then
'如果请求类型是图片
Dim
fl
As
String
= FileSys.GetName(url)
'获得图片文件名
If
fl >
""
Then
fl =
"http://www.foxtable.com/image/"
& fl
'获得对应的远程图片地址
Using
response
As
System.Net.Http.HttpResponseMessage =
Await
httpClient.GetAsync(fl)
'异步发送请求
If
response.IsSuccessStatusCode
Then
'如果请求成功
Dim
remoteStream
As
Stream =
Await
response.Content.ReadAsStreamAsync()
'异步获得流
Dim
ms
As
New
MemoryStream()
Await
remoteStream.CopyToAsync(ms)
'异步读取到内存流
ms.Position = 0
'
重置内置流指针到起始位置
e.Response = wv.CoreWebView2.Environment.CreateWebResourceResponse(ms, 200,
"OK",
"Content-Type: image/png")
Else
e.Response = wv.CoreWebView2.Environment.CreateWebResourceResponse(
New
System.IO.MemoryStream(), 404,
"Not
Found",
"Content-Type: text/plain")
End
If
End
Using
End
If
End
If
End
If
Catch
ex
As
Exception
e.Response =
wv.CoreWebView2.Environment.CreateWebResourceResponse(New
System.IO.MemoryStream(), 500,
"Internal Error",
"Content-Type: text/plain")
Finally
deferral.Complete()
'通知WebViewer事件执行完毕
End
Try
同步版
如果服务器稳定可靠切图片很小,也可以不用异步方法,改为同步方法。
下面是同步版的WebResourceRequested事件代码:
Dim
wv
As
WebViewer = e.Sender.WebViewer
Dim
url = e.Request.Uri.ToLower()
If
url.StartsWith("custom://chart/")
AndAlso
e.ResourceContext = CoreWebView2WebResourceContext.Image
Then
Dim
fl
As
String
= FileSys.GetName(url)
If
fl >
""
Then
fl =
"http://www.foxtable.com/image/"
& fl
Try
Dim
webClient
As
New
System.Net.WebClient()
Dim
stream
As
New
MemoryStream(webClient.DownloadData(fl))
e.Response =
wv.CoreWebView2.Environment.CreateWebResourceResponse(stream, 200,
"OK",
"Content-Type: image/png")
Catch
e.Response =
wv.CoreWebView2.Environment.CreateWebResourceResponse(New
MemoryStream(), 404,
"Not
Found",
"")
End
Try
End
If
End
If
提示:本节的示例主要是为了演示异步方法的调用,其实对于远程资源,最方便可靠的方法还是使用重定向,下一节会介绍。