虚拟主机映射
本节内容可以参考示例文件"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、存数据),就应该用虚拟主机映射。