最近开始学习.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. list的方法、操作

    序号 分类 关键字 / 函数 / 方法 说明 1 增加 列表.insert(索引, 数据) 在指定位置插入数据     列表.append(数据) 在末尾追加数据     列表.extend(列表2) ...

  2. Kafka介绍及安装部署

    本节内容: 消息中间件 消息中间件特点 消息中间件的传递模型 Kafka介绍 安装部署Kafka集群 安装Yahoo kafka manager kafka-manager添加kafka cluste ...

  3. Java-SpringMvc-@ResponseBody返回中文字符串乱码

    第一种.注解 @RequestMapping(value = "/test.do", method = {RequestMethod.GET},produces = "t ...

  4. Windows下pycharm使用theano的方法

    安装theano前需要自行安装Anaconda和PyCharm.在网上查了在PyCharm上安装theano的方法,但是均遇到了一些问题,现将问题与解决方案介绍如下. (一)第一种安装方式 打开cmd ...

  5. 2017php经典面试题

    1.PHP语言的一大优势是跨平台,什么是跨平台?一.PHP基础: PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows.Linux等)上配置,不 ...

  6. Spark会把数据都载入到内存么?

    前言 很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解. 比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念的误导: RDD ...

  7. Y2K Accounting Bug(poj2586)

    题意: 有一个公司由于某个病毒使公司赢亏数据丢失,但该公司每月的 赢亏是一个定数,要么一个月赢利s,要么一月亏d.现在ACM只知道该公司每五个月有一个赢亏报表,而且每次报表赢利情况都为亏.在一年中这样 ...

  8. 尝试.Net Core—使用.Net Core + Entity FrameWork Core构建WebAPI(一)

    想尝试.Net Core很久了,一直没有时间,今天回家,抛开一切,先搭建一个.Net Core的Demo出来玩玩. 废话少说,咱直奔主题: 一.开发环境 VS2015 Update3 Microsof ...

  9. OO第三次阶段性总结

    一.规格化设计的历史以及人们重视的原因 发展历史 从20世纪60年代开始,就存在着许多不同的形式规格说明语言和软件开发方法.在形式规格说明领域一些最主要的发展过程列举如下: 1969-1972 C.A ...

  10. c#string为传值模式

    闲的无聊,记忆中好像是在c/c++语言中string为传址模式(函数修改参数时会影响原来的string参数值),比较好奇c#下对于string参数到底是传值还是传址有些疑问,便亲自测试. 1.结果aa ...