异步请求远程资源

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

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

提示本节的示例主要是为了演示异步方法的调用,其实对于远程资源,最方便可靠的方法还是使用重定向,下一节会介绍。


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