虚拟主机映射

本节内容可以参考示例文件"CaseStudy\WebViewer\虚拟主机映射.Table"。

WebViewer提供了虚拟主机映射功能,让我们可以将本地文件夹映射为一个虚拟的域名,从而用https://或http://协议访问本地资源,有效绕过file://协议下的诸多限制。

当直接使用file://协议加载本地网页时,会面临以下限制:

通过虚拟主机映射,我们可以让本地网页运行在标准的HTTP/HTTPS环境下,享受与线上环境完全一致的功能体验。

WebViewer提供了两个方法用于管理虚拟主机映射:

方法 说明
SetVirtualHostNameToFolderMapping 建立从虚拟主机名到本地文件夹的映射
ClearVirtualHostNameToFolderMapping 清除指定的虚拟主机映射

示例

在"CaseStudy\WebViewer\virtualhost"目录下,我建立了一个小型的网站,包括以下文件:

virtualhost
├── index.html # 主页面
├── style.css # 样式文件
├── app.js # JavaScript脚本(包含fetch测试)
└── data.json # JSON数据文件

打开示例文件"CaseStudy\WebViewer\虚拟主机映射.Table",可以看到两个窗口。

第一个窗口"常规访问"直接以本地文件的形式访问,AfterLoad事件代码为:

'''Async
Dim
wv As WebViewer = e.Form.Controls("WebViewer1").WebViewer
Await
wv.EnsureCoreWebView2Async(Nothing)
wv.CoreWebView2.Navigate(ProjectPath &
"virtualhost/index.html")

打开后显示的页面如下,出现了两个错误:

第二个窗口"虚拟主机映射"将目录映射为虚拟主机,用域名的形式访问 ,AfterLoad事件代码为:

'''Async
Dim
wv As WebViewer = e.Form.Controls("WebViewer1").WebViewer
Await
wv.EnsureCoreWebView2Async(Nothing) ' 初始化WebViewer
Dim
virtualHostPath As String = ProjectPath & "virtualhost" '指定虚拟主机所在目录
Dim
virtualHost As String = "app.local" '指定虚拟主机域名
wv.CoreWebView2.SetVirtualHostNameToFolderMapping(
    virtualHost,
    virtualHostPath,
    CoreWebView2HostResourceAccessKind.Allow
)
'虚拟主机映射
wv.CoreWebView2.Navigate(
"https://" & virtualHost & "/index.html") '访问虚拟主机首页"https://app.local/index.html"

打开后显示的页面如下,一切正常:

提示:

1、 CoreWebView2HostResourceAccessKind用于控制虚拟主机映射的资源访问权限,本例中使用的是 CoreWebView2HostResourceAccessKind.Allow,表示允许所有形式的跨域访问。由于我们访问的都是自己放在本地的网页,绝对信任,所以直接用 Allow 即可。如果你对安全性有更高要求,也可以选择 DenyCors(允许 DOM 请求但禁止脚本请求)或 Deny(完全禁止跨域访问)

2、映射虚拟主机需要一定的时间,所以打开对个页面会比较慢,之后跳转页面的速度就正常了。

什么时候需要用虚拟主机映射?

如果你不确定自己的项目是否需要虚拟主机映射,可以参考以下几个典型场景:

场景 说明
✅ 需要加载本地JSON数据 页面中用fetch或XMLHttpRequest请求同目录的data.json等文件
✅ 需要调用Web API 用到getUserMedia(摄像头/麦克风)、Notification(通知)、Geolocation(定位)等
✅ 需要读写Cookie 页面需要维护登录状态或用户偏好设置
✅ 离线应用 所有HTML/CSS/JS/图片都打包在本地,需要像线上一样运行
✅ 本地开发测试 在WebViewer中直接加载Vue/React打包后的dist文件夹,无需启动本地服务器
❌ 不需要映射 纯静态HTML/CSS展示,没有JS发起的请求,没有Web API调用

一句话总结:只要你的本地网页需要“动起来”(发请求、调API、存数据),就应该用虚拟主机映射。


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