最近开始学习.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; } } }