.Net Core集成Office Web Apps(一)
最近开始学习.Net Core,并使用Visual Studio Code工具来开发。感觉开发起来特别的方便,但是有个头疼的地方:许多的类库被修改了,一时半会儿还熟悉不了,需要查阅官方API。。。
Microsoft Office Web Apps(以下简称OWA)是由微软推出的基于Web端的在线办公工具,它将Microsoft Office产品的体验延伸到可支持的浏览器上。OWA让你可以在任何地方共享自己的Office文档。
系统集成OWA需要参考官方的系统接口定义(https://wopi.readthedocs.io/en/latest/),这个接口简称WOPI(Web Application Open Platform Interface)。
下面介绍一个完整的OWA的例子,最终效果如图:
wopi协议的工作流程如下图
我们所要做的就是开发一个OWA客户端,提供文件信息及文件流给OWA服务器,当然也接收从OWA服务POST来的文件流来保存文件,出于安全考虑也可以加上access_token进行自定义权限验证。
标准的WOPI服务包括:CheckFileInfo、GetFile、Lock、GetLock、RefreshLock、Unlock、UnlockAndRelock、PutFile、PutRelativeFile、RenameFile、DeleteFile、PutUserInfo等
返回状态码定义:
200 OK 成功
400 Bad Request 错误请求
401 Unauthorized 非法 与access_token相关
409 Conflict 冲突 目标文件已经存在或LOCK
413 Request Entity Too Large 文件太大
500 Internal Server Error 内部服务器错误
501 Not Implemented 不支持,如果CheckFileInfo的SupportsUpdate和UserCanNotWriteRelative都设置为true,则必须返回501
OwaFileInfo类
需要定义一个文件信息类,该类的主要属性包括:
属性名 |
类型 |
描述 |
BaseFileName |
String |
包含扩展的文件名 |
BreadcrumbFolderName |
String |
文件夹名称(界面显示) |
BreadcrumbDocName |
String |
文档名称(界面显示) |
OwnerId |
String |
唯一标识文件所有者 |
Size |
Long |
文件大小 |
SHA256 |
String |
SHA-2 256位散列编码值 |
Version |
String |
版本编号 |
SupportsUpdate |
Bool |
是否支持PUT文件 |
UserCanWrite |
Bool |
是否有权限修改 |
SupportsLocks |
Bool |
是否支持Lock和Unlock |
CloseButtonClosesWindow |
Bool |
是否显示关闭按钮 |
更多属性参考API https://wopirest.readthedocs.io/en/latest/files/CheckFileInfo.html |
属性名必须与API中一致才能被OWA服务器识别。
using System; using System.Runtime.Serialization;namespace WebApplication.Models.FileInfoModels {[DataContract(Name = "OwaFileInfo")]public class OwaFileInfo{public OwaFileInfo(){this.SupportsUpdate = false;this.UserCanWrite = false;this.SupportsLocks = false;}[DataMember(Name = "BaseFileName")]public string BaseFileName { get; set; }[DataMember(Name = "OwnerId")]public string OwnerId { get; set; }[DataMember(Name = "Size")]public long Size { get; set; }[DataMember(Name = "SHA256")]public string SHA256 { get; set; }[DataMember(Name = "Version")]public string Version { get; set; }[DataMember(Name = "SupportsUpdate")]public bool SupportsUpdate { get; set; }[DataMember(Name = "UserCanWrite")]public bool UserCanWrite { get; set; }[DataMember(Name = "SupportsLocks")]public bool SupportsLocks { get; set; }[DataMember(Name = "BreadcrumbDocName")]public string BreadcrumbDocName { get; set; }[DataMember(Name = "CloseButtonClosesWindow")]public bool CloseButtonClosesWindow { get; set; }[DataMember(Name = "BreadcrumbFolderName")]public string BreadcrumbFolderName { get; set; }} }
OwaFileInfo
CheckFileInfo服务
接口要求实现CheckFileInfo服务,作用是OWA服务器需要获取文件的详细信息和操作权限(如:是否可编辑),以确保文件的真实有效。这些信息已经在上面的类中进行了定义。
Method:GET
URI:HTTP://server/<...>/wopi*/files/<id>
Request Headers:
X-WOPI-SessionContext 上下文session参数值
该接口需要返回的json格式如:
{"BaseFileName":"test.docx","OwnerId":"admin","Size":798,"SHA256":"wlbRK+XNdLtHNaOcXnejbIVzHPHAZzI+1MhKNHUCVlw=","Version":"2016-03-17T02:27:33","SupportsUpdate":true,"UserCanWrite":true,"SupportsLocks":true,"WebEditingDisabled":false}
说明:
0.返回的属性名区分大小写,很多插件默认将头字母转换成小写,最终导致对接失败。
1.所有的OWA客户端接口URl必须以/wopi开头
如:
http://localhost:5000/api/wopi/files/test.docx
http://localhost:5000/api/wopi_test/files/test.docx
2. SHA256的计算
a.获取该文件的文件流
b SHA256计算文件流Hash值
c.将Hash值转换为Base64String
string sha256 = ""; using (FileStream stream = File.OpenRead(fileName)) using (var sha = SHA256.Create()) {byte[] checksum = sha.ComputeHash(stream);sha256 = Convert.ToBase64String(checksum); }
3.验证action返回的结果,访问http://localhost:5000/api/wopi/files/test.docx,返回结果如下图
GetFile服务
当office web apps检验完文件信息后就可以获取文件了
Method:GET
URI: HTTP://server/<...>/wopi*/files/<id>/contents?access_token=<token>
Request Headers:
X-WOPI-MaxExpectedSize
Response Headers:
X-WOPI-ItemVersion 文件版本号类似于CheckFileInfo里的Version
返回文件的二进制流
[Route("files/{name}/contents")] [HttpGetAttribute] public FileStreamResult Get(string name, string access_token) {var file = "Files/" + name;var stream = new FileStream(file, FileMode.Open, FileAccess.Read);return new FileStreamResult(stream, "application/octet-stream"); }
PutFile服务
Method:POST
URI: HTTP://server/<...>/wopi*/files/<id>/contents?access_token=<token>
Request Headers:
X-WOPI-Override 固定值 PUT,必须
X-WOPI-Lock 锁定请求的字符串标识(具体参考LOCK请求)
Response Headers:
X-WOPI-Lock锁定请求的字符串标识
X-WOPI-LockFailureReason 锁定失败原因
X-WOPI-ItemVersion 版本号
请求内容为文件的二进制格式
[Route("files/{name}/contents")] [HttpPostAttribute] public async void Post(string name, string access_token) {using (FileStream fs = System.IO.File.Create("Files/" + name)){await Request.Body.CopyToAsync(fs);} }
至此基本的Office在线预览功能就基本完成了
后续工作:
1.规范请求和返回的头信息,完善功能实现在线编辑
2.引入配置文件和缓存配置数据
3.添加预览和编辑链接生成controller
4.完善access_token验证逻辑
转载于:https://www.cnblogs.com/liuxiaobo93/p/5819595.html
.Net Core集成Office Web Apps(一)相关推荐
- office web apps java_整合Office Web Apps至自己的开发系统
原文出处:http://www.cnblogs.com/poissonnotes/p/3267190.html 还可参考:https://www.cnblogs.com/majiang/p/36729 ...
- 部署Office Web Apps Server并配置其与SharePoint 2013的集成
1.此示例将删除运行此 cmdlet 的当前 SharePoint 场上的所有绑定.Remove-SPWOPIBinding -All:$true2.设置绑定New-SPWOPIBinding -Se ...
- 借助office web apps实现在线预览和在线编辑
我所有的代码都是用go语言编写,你可以直接编译后使用,不用再有其他的操作. 最近项目实在太忙,这几天才有时间,这次是重头戏,要好好琢磨一下怎么写,才能更简洁的说清楚一切. 上一节,我们已经安装完毕,安 ...
- office 在线浏览和编辑 部署 Office Web Apps Server
Office Web Apps Server Office Web Apps Server 是一款 Office 服务器产品,可提供针对 Office 文件的基于浏览器的文件查看和编辑服务.Offic ...
- 【OWA】03安装部署:OWA(Office Web Apps)安装和部署
前言 在上一篇咱们把owa服务器加入到了域控中,可参考[OWA]02加入域控:将owa服务器加入域控(把计算机加入到域中), 接下来就在这台服务器上安装和配置OWA相关服务 [OWA]01环境准备:通 ...
- web快照管理_屏幕快照之旅:看一下新的Office Web Apps
web快照管理 One of the most talked about new features of Office 2010 is Web Apps. Here we bring you a to ...
- Lync server 2013 之office web apps server 搭建步骤
office web apps server 搭建步骤: 一. .NET Framework 4.5 节点下的HTTP 激活 .NET Framework 3.5 Windows Identity F ...
- 在线文档预览方案-office web apps续篇
上一篇在线文档预览方案-office web apps发布后收到很多网友的留言提问,所以准备再写一篇,一来介绍一下域控服务器安装,总结一下大家问的多的问题,二来宣传预览服务安装与技术支持的事情. 阅读 ...
- 在线文档预览方案-office web apps
原文:在线文档预览方案-office web apps 最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现 ...
最新文章
- VBScript中InStr函数的用法
- 【PAT乙级】1028 人口普查 (20 分)
- Matlab错误:Y must be a vector or a character array
- IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
- Console的使用——Google Chrome代码调试
- python功能模块之psutil_1.python系统性能信息模块之psutil模块
- 第 19 次 CCF CSP 认证 202006-1 线性分类器(line)
- conda创建环境及激活环境失败问题
- 行列式(determinant)的物理意义及性质
- C++教程:C++开发的四重境界是什么?
- 微信JS-SDK项目学习 --实现分享样式控制thinkphp
- 推荐系统回顾,FFM引入特征域进一步增强了模型的表达能力。大规模分段线性模型LS-PLM
- matlab画随机信号,(最新整理)随机信号处理基础matlab仿真
- Windows设置redis开启自动启动
- 2018版苹果开发者设置内购、税务、银行问题
- 什么是消费者需求研究
- 上海科学家研制出新型“耐火宣纸”
- 源代码来了 | 英伟达开源行人生成/重识别代码
- 教师资格证报名网站内部服务器错误,教师资格证报名入口进不去怎么办
- idea修改批量替换快捷键_idea当配置eclipse快捷键时,全局替换的快捷键是什么?...