最近开始学习.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(一)相关推荐

  1. office web apps java_整合Office Web Apps至自己的开发系统

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

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

    1.此示例将删除运行此 cmdlet 的当前 SharePoint 场上的所有绑定.Remove-SPWOPIBinding -All:$true2.设置绑定New-SPWOPIBinding -Se ...

  3. 借助office web apps实现在线预览和在线编辑

    我所有的代码都是用go语言编写,你可以直接编译后使用,不用再有其他的操作. 最近项目实在太忙,这几天才有时间,这次是重头戏,要好好琢磨一下怎么写,才能更简洁的说清楚一切. 上一节,我们已经安装完毕,安 ...

  4. office 在线浏览和编辑 部署 Office Web Apps Server

    Office Web Apps Server Office Web Apps Server 是一款 Office 服务器产品,可提供针对 Office 文件的基于浏览器的文件查看和编辑服务.Offic ...

  5. 【OWA】03安装部署:OWA(Office Web Apps)安装和部署

    前言 在上一篇咱们把owa服务器加入到了域控中,可参考[OWA]02加入域控:将owa服务器加入域控(把计算机加入到域中), 接下来就在这台服务器上安装和配置OWA相关服务 [OWA]01环境准备:通 ...

  6. 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 ...

  7. Lync server 2013 之office web apps server 搭建步骤

    office web apps server 搭建步骤: 一. .NET Framework 4.5 节点下的HTTP 激活 .NET Framework 3.5 Windows Identity F ...

  8. 在线文档预览方案-office web apps续篇

    上一篇在线文档预览方案-office web apps发布后收到很多网友的留言提问,所以准备再写一篇,一来介绍一下域控服务器安装,总结一下大家问的多的问题,二来宣传预览服务安装与技术支持的事情. 阅读 ...

  9. 在线文档预览方案-office web apps

    原文:在线文档预览方案-office web apps 最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现 ...

最新文章

  1. VBScript中InStr函数的用法
  2. 【PAT乙级】1028 人口普查 (20 分)
  3. Matlab错误:Y must be a vector or a character array
  4. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
  5. Console的使用——Google Chrome代码调试
  6. python功能模块之psutil_1.python系统性能信息模块之psutil模块
  7. 第 19 次 CCF CSP 认证 202006-1 线性分类器(line)
  8. conda创建环境及激活环境失败问题
  9. 行列式(determinant)的物理意义及性质
  10. C++教程:C++开发的四重境界是什么?
  11. 微信JS-SDK项目学习 --实现分享样式控制thinkphp
  12. 推荐系统回顾,FFM引入特征域进一步增强了模型的表达能力。大规模分段线性模型LS-PLM
  13. matlab画随机信号,(最新整理)随机信号处理基础matlab仿真
  14. Windows设置redis开启自动启动
  15. 2018版苹果开发者设置内购、税务、银行问题
  16. 什么是消费者需求研究
  17. 上海科学家研制出新型“耐火宣纸”
  18. 源代码来了 | 英伟达开源行人生成/重识别代码
  19. 教师资格证报名网站内部服务器错误,教师资格证报名入口进不去怎么办
  20. idea修改批量替换快捷键_idea当配置eclipse快捷键时,全局替换的快捷键是什么?...

热门文章

  1. ubuntu安装环境软件全文档
  2. 敏捷结果30天之第十二天:效率角色-你是启动者还是完成者
  3. C# 函数 传入 C++动态库中 做回调函数
  4. RRDTool学习资料备忘
  5. Jenkins发布spring boot到hub.Docker 方法
  6. Linux查看系统各类信息
  7. object-c 日志
  8. dll文件的c++制作dll文件的c++制作
  9. for else语句小tips : RUNOOB python练习题36
  10. Coriant助力Aureon部署100Gbps光纤网络