最近开始学习.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. Hadoop DistributedCache分布式缓存的使用

    做项目的时候遇到一个问题,在Mapper和Reducer方法中处理目标数据时,先要去检索和匹配一个已存在的标签库,再对所处理的字段打标签.因为标签库不是很大,没必要用HBase.我的实现方法是把标签库 ...

  2. [py]python多态-动态语言的鸭子类型

    弱类型?强类型?动态语言,静态语言 弱类型: 在程序运行过程中,类型可变 还有一种说法: 动态 variables must necessarily be defined before they ar ...

  3. 搭建私有yum仓库

    需要工具: centos7 nginx rsync 新建文件夹存放镜像数据 mkdir /data mkdir /data/yum_data 同步数据 国内开源镜像站没有几个支持rsync,科技大学的 ...

  4. [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 ...

  5. Floyd 判圈算法

    Floyd 判圈算法 摘自维基百科, LeetCode 上 141题 Linked List Cycle 用到这个, 觉得很有意思. 记录一下. 链接: https://zh.wikipedia.or ...

  6. iOS下拉刷新和上拉刷新

    在iOS开发中,我们经常要用到下拉刷新和上拉刷新来加载新的数据,当前这也适合分页.iOS原生就带有该方法,下面就iOS自带的下拉刷新方法来简单操作. 上拉刷新 1.在TableView里,一打开软件, ...

  7. git的使用(包括创建远程仓库到上传代码到git的详细步骤以及git的一些常用命令)

    A创建远程仓库到上传代码到git 1)登陆或这注册git账号 https://github.com 2)创建远程仓库 3)打开终端输入命令 cd到你的本地项目根目录下,执行如下git命令 git in ...

  8. 第三章基本的SQl查询语言

    ---恢复内容开始--- ---恢复内容结束---

  9. JS中“==”和“===”的原理和区别

    1.为什么讨论这个问题? - 有个说法,尽量不用==,而使用===,是这样吗? 2.分析问题,原理是什么? 下面说说ECMAScript 5 language specification里的说明: 1 ...

  10. Base64编码加密

    package liferay; public class Base64 { public static final char EQUAL = '='; public static final cha ...