最近开始学习.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(一)的更多相关文章

  1. .Net Core集成Office Web Apps(二)

    想要使用OWA需要一台单独的服务器来部署,这对很多人造成困难.而写该文的目的是为了分享有个OWA的集成步骤,它不仅适用于.Net开发环境,其它语言也是一样的,只要实现了需要的服务接口.并且该文不局限与 ...

  2. SharePoint RBS 安装(集成Office Web Apps)

    前言 本文完全原创,转载请说明出处,希望对大家有用. 本篇博客是个人总结,一方面以便日后查看,另一方面希望能为其他人提供一些便利. 阅读目录 安装RBS 为多个内容数据库开启RBS 正文 目的:在Sh ...

  3. 部署Office Web Apps Server并配置其与SharePoint 2013的集成

    部署Office Web Apps Server并配置其与SharePoint 2013的集成   Office Web Apps Server 是新的 Office 服务器产品,它提供 Word.P ...

  4. 新手必看!Office Web Apps 2013 安装与配置(实战)

    分享人:广州华软 星尘 一. 前言 Office Web Apps Server 是Office 服务器产品,它可提供在Sharepoint 2013网站中在线浏览和编辑 Word.PowerPoin ...

  5. 如何整合Office Web Apps至自己开发的系统(一)

    在前面我的一篇博客中 Office Web Apps安装部署(一),有一张介绍Office Web Apps与其他系统的关系图,   从上述图中,可知实际上Office Web Apps也是可以接入自 ...

  6. 整合Office Web Apps至自己的开发系统

    原文出处:http://www.cnblogs.com/poissonnotes/p/3267190.html 还可参考:https://www.cnblogs.com/majiang/p/36729 ...

  7. [转载]部署Office Web Apps Server并配置其与SharePoint 2013的集成

    Office Web Apps Server 是新的 Office 服务器产品,它提供 Word.PowerPoint.Excel 和 OneNote 的基于浏览器的版本.单个 Office Web ...

  8. sharepoint 2013 和 office web apps server 2013集成

    环境: 三台服务器  系统:window 2008 R2server01: 192.168.10.162(office web app)server02: 192.168.10.163(AD)serv ...

  9. Office Web Apps Server 概述

    Office Web Apps Server 是新的 Office 服务器产品,它提供 Word.PowerPoint.Excel 和 OneNote 的基于浏览器的版本.单个 Office Web ...

随机推荐

  1. 订阅号助手App发布 手机也能管理公众号了

    盼着许久的微信订阅号助手app终于发布了!“ 微信团队发布「订阅号助手」App,支持公众号运营者在手机上发表内容.查看和回复消息.管理已关注用户和帐号.暂时只支持iOS平台,Android平台敬请期待 ...

  2. 第十八篇:融汇贯通--谈USB Video Class驱动

    USB Video Class驱动是WINDOWS系统包含的一个针对于USB VIDEO 类的驱动程序. 好多project师都做过USB VIDEO设备端的开发, 基本的工作内容为: 使用FIRMW ...

  3. 学JS必看-JavaScript数据结构深度剖析

    回归简单 要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原.前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系.JavaScript就是把数据和 ...

  4. Centos 设置zookeeper开机自启动

    把zookeeper做成服务 1.进入到/etc/rc.d/init.d目录下,新建一个zookeeper脚本 [root@zookeeper ~]# cd /etc/rc.d/init.d/ [ro ...

  5. PAT 1030 Travel Plan[图论][难]

    1030 Travel Plan (30)(30 分) A traveler's map gives the distances between cities along the highways, ...

  6. 9/252D图的画法

    我们在介绍之前先想想2D图的一些元素 我在这里按我的思路写下一些: 坐标轴(尺度,区间..),线条(样式,颜色...),图和线的标签和注释,图像大小,图像里图片的排版(一张图像中多张图) 下面我们将分 ...

  7. Navicat 连接 Mysql8.0 出现2059问题的解决方法

    ``` 登陆Mysql后执行命令 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; ...

  8. POJ 1836

    刚开始二分写错了 wa了很久 这个二分 的好好想想 #include <iostream> #include<cstdio> #include<string.h> ...

  9. 20154312 曾林 EXP6 信息搜集与漏洞扫描

    目录 1.实验后回答问题 2.实验总结与体会 3.实践过程记录 --3.1.信息收集 ----3.1.1.whois查询 ----3.1.2.nslookup,dig查询 ----3.1.3.trac ...

  10. wkhtmtopdf--高分辨率HTML转PDF(二)

    命令行 wkhtmtopdf有一些很实用的命令,平时如果不用代码,可以直接使用命令行来把你喜欢的任意网页转换为PDF, 命令行参考网址:http://madalgo.au.dk/~jakobt/wkh ...