.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验证逻辑
.Net Core集成Office Web Apps(一)的更多相关文章
- .Net Core集成Office Web Apps(二)
想要使用OWA需要一台单独的服务器来部署,这对很多人造成困难.而写该文的目的是为了分享有个OWA的集成步骤,它不仅适用于.Net开发环境,其它语言也是一样的,只要实现了需要的服务接口.并且该文不局限与 ...
- SharePoint RBS 安装(集成Office Web Apps)
前言 本文完全原创,转载请说明出处,希望对大家有用. 本篇博客是个人总结,一方面以便日后查看,另一方面希望能为其他人提供一些便利. 阅读目录 安装RBS 为多个内容数据库开启RBS 正文 目的:在Sh ...
- 部署Office Web Apps Server并配置其与SharePoint 2013的集成
部署Office Web Apps Server并配置其与SharePoint 2013的集成 Office Web Apps Server 是新的 Office 服务器产品,它提供 Word.P ...
- 新手必看!Office Web Apps 2013 安装与配置(实战)
分享人:广州华软 星尘 一. 前言 Office Web Apps Server 是Office 服务器产品,它可提供在Sharepoint 2013网站中在线浏览和编辑 Word.PowerPoin ...
- 如何整合Office Web Apps至自己开发的系统(一)
在前面我的一篇博客中 Office Web Apps安装部署(一),有一张介绍Office Web Apps与其他系统的关系图, 从上述图中,可知实际上Office Web Apps也是可以接入自 ...
- 整合Office Web Apps至自己的开发系统
原文出处:http://www.cnblogs.com/poissonnotes/p/3267190.html 还可参考:https://www.cnblogs.com/majiang/p/36729 ...
- [转载]部署Office Web Apps Server并配置其与SharePoint 2013的集成
Office Web Apps Server 是新的 Office 服务器产品,它提供 Word.PowerPoint.Excel 和 OneNote 的基于浏览器的版本.单个 Office Web ...
- sharepoint 2013 和 office web apps server 2013集成
环境: 三台服务器 系统:window 2008 R2server01: 192.168.10.162(office web app)server02: 192.168.10.163(AD)serv ...
- Office Web Apps Server 概述
Office Web Apps Server 是新的 Office 服务器产品,它提供 Word.PowerPoint.Excel 和 OneNote 的基于浏览器的版本.单个 Office Web ...
随机推荐
- Hadoop DistributedCache分布式缓存的使用
做项目的时候遇到一个问题,在Mapper和Reducer方法中处理目标数据时,先要去检索和匹配一个已存在的标签库,再对所处理的字段打标签.因为标签库不是很大,没必要用HBase.我的实现方法是把标签库 ...
- [py]python多态-动态语言的鸭子类型
弱类型?强类型?动态语言,静态语言 弱类型: 在程序运行过程中,类型可变 还有一种说法: 动态 variables must necessarily be defined before they ar ...
- 搭建私有yum仓库
需要工具: centos7 nginx rsync 新建文件夹存放镜像数据 mkdir /data mkdir /data/yum_data 同步数据 国内开源镜像站没有几个支持rsync,科技大学的 ...
- [LeetCode] 198. House Robber _Easy tag: Dynamic Programming
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- Floyd 判圈算法
Floyd 判圈算法 摘自维基百科, LeetCode 上 141题 Linked List Cycle 用到这个, 觉得很有意思. 记录一下. 链接: https://zh.wikipedia.or ...
- iOS下拉刷新和上拉刷新
在iOS开发中,我们经常要用到下拉刷新和上拉刷新来加载新的数据,当前这也适合分页.iOS原生就带有该方法,下面就iOS自带的下拉刷新方法来简单操作. 上拉刷新 1.在TableView里,一打开软件, ...
- git的使用(包括创建远程仓库到上传代码到git的详细步骤以及git的一些常用命令)
A创建远程仓库到上传代码到git 1)登陆或这注册git账号 https://github.com 2)创建远程仓库 3)打开终端输入命令 cd到你的本地项目根目录下,执行如下git命令 git in ...
- 第三章基本的SQl查询语言
---恢复内容开始--- ---恢复内容结束---
- JS中“==”和“===”的原理和区别
1.为什么讨论这个问题? - 有个说法,尽量不用==,而使用===,是这样吗? 2.分析问题,原理是什么? 下面说说ECMAScript 5 language specification里的说明: 1 ...
- Base64编码加密
package liferay; public class Base64 { public static final char EQUAL = '='; public static final cha ...