Office 2016加载项本地进程通信问题及HTTP请求权限咨询
Office 2016加载项本地进程通信解决方案
你碰到的这个Access is denied问题我之前帮不少开发者解决过,确实是Office 2016加载项的安全策略在起作用:默认情况下,Web型加载项只允许发起HTTPS请求,哪怕是指向localhost的HTTP请求也会被跨域安全规则拦截——这是微软为了防范恶意加载项发起不安全网络请求的默认限制。
下面分两部分帮你解决问题:
一、修改加载项清单允许HTTP localhost请求(有限场景可用)
你可以尝试通过修改加载项的XML清单,把http://localhost:8080加入信任的应用域列表,具体步骤如下:
- 打开你的加载项清单文件(一般叫
manifest.xml) - 在
<OfficeApp>根节点下新增<AppDomains>节点,把你的本地服务器地址加进去:
<AppDomains> <AppDomain>http://localhost:8080</AppDomain> </AppDomains>
- 保存清单后重新部署加载项
不过要提前打个预防针:这种方法在某些Office 2016版本(尤其是用IE11作为Web宿主的老版本)可能仍然不好使,因为IE11的跨域策略对HTTP的localhost请求还有额外的安全校验,不一定能彻底解决问题。
二、本地进程通信的最佳实践(无需互联网HTTPS)
如果修改清单没用,或者你需要更稳定的方案,推荐下面几种靠谱的方式:
1. 搭个本地HTTPS服务器(用自签名证书)
这是最稳妥的方案,因为Office加载项完全信任HTTPS请求,哪怕是你自己生成的自签名证书:
- 用OpenSSL生成自签名SSL证书,执行这条命令就行:
openssl req -x509 -newkey rsa:4096 -keyout localhost.key -out localhost.crt -days 365 -nodes -subj "/CN=localhost"
- 把生成的
localhost.crt安装到本地计算机的信任根证书颁发机构里,这样Office就不会跳证书不安全的提示了 - 把你的本地HTTP服务器改成HTTPS模式,用上刚才生成的证书和密钥
- 之后加载项发
https://localhost:8080的请求就不会被拦截了
2. 用Windows Runtime API(仅限Windows平台的Office 2016)
如果你的加载项只在Windows上跑,可以利用Office加载项对WinRT API的有限访问权限,用**命名管道(Named Pipes)**实现本地进程通信:
- 在加载项的JS代码里,通过
window.Windows调用WinRT的命名管道API,和本地其他进程建立通信 - 记得在清单里把
<Permissions>设为ReadWriteDocument(部分复杂场景可能需要更高权限)
3. 剪贴板临时通信(适合简单场景)
如果你的通信需求很简单(比如传点文本数据),可以用剪贴板当中间通道:
- 本地进程把数据写到系统剪贴板
- 加载项用
navigator.clipboard.readText()读取内容 - 这个方案不用额外配置,但不适合频繁或复杂的通信,而且有数据泄露的风险
内容的提问来源于stack exchange,提问作者Carles
相关产品推荐
相关产品推荐

