如何设置DotNetBrowser 1.21.5.0允许调用本地存储的EXE文件
DotNetBrowser 1.21.5.0 调用本地EXE问题解决方案
根因说明
DotNetBrowser 1.x系列默认拦截非http/https的自定义协议请求,以及file://协议指向的本地可执行文件启动逻辑,导致和Chrome默认行为不一致,出现调用失败的问题。
适配方案
1. 自定义协议调用场景适配
如果调用本地EXE的链接是已在系统注册的自定义协议(格式如custom://xxxx),可通过重写LoadHandler的OnBeforeLoad事件拦截请求并放行:
// Browser控件初始化完成后注册自定义LoadHandler browser.LoadHandler = new CustomLoadHandler(); public class CustomLoadHandler : DefaultLoadHandler { protected override bool OnBeforeLoad(LoadParams loadParams) { var requestUrl = loadParams.Url; // 替换为你业务实际用到的自定义协议前缀 if (requestUrl.StartsWith("your-custom-protocol://", StringComparison.OrdinalIgnoreCase)) { // 调用系统默认程序处理该协议请求 System.Diagnostics.Process.Start(requestUrl); // 中断DotNetBrowser默认加载逻辑 return true; } return base.OnBeforeLoad(loadParams); } }
2. 本地EXE的file协议链接适配
如果页面通过<a href="file:///C:/path/xxx.exe">形式直接指向本地EXE,可添加对应判断逻辑:
protected override bool OnBeforeLoad(LoadParams loadParams) { var requestUrl = loadParams.Url; if (requestUrl.StartsWith("file://") && requestUrl.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) { // 转换file协议路径为本地物理路径 string localExePath = new Uri(requestUrl).LocalPath; if (System.IO.File.Exists(localExePath)) { System.Diagnostics.Process.Start(localExePath); return true; } } // 可保留之前的自定义协议判断逻辑 return base.OnBeforeLoad(loadParams); }
3. 全局权限配置补充
如果以上逻辑仍被拦截,可在Browser初始化时添加权限配置:
var browserPrefs = new BrowserPreferences { // 允许file协议访问本地文件 AllowFileAccessFromFiles = true }; // 添加业务用到的自定义协议到白名单 browserPrefs.AllowedSchemes.Add("your-custom-protocol"); // 用配置初始化Browser实例 Browser browser = BrowserFactory.Create(browserPrefs);
注意事项
- 建议仅放行业务所需的特定协议/本地路径,避免全局放行带来的安全风险
- 若启动的EXE需要管理员权限,需确保当前C#主程序拥有对应权限,否则
Process.Start会触发权限异常 - DotNetBrowser 1.21.5.0不兼容2.x及以上版本的
ProtocolHandler系列API,上述方案为该版本适配的原生实现
内容的提问来源于stack exchange,提问作者Richard Rahl
相关产品推荐
相关产品推荐

