想要使用OWA需要一台单独的服务器来部署,这对很多人造成困难。而写该文的目的是为了分享有个OWA的集成步骤,它不仅适用于.Net开发环境,其它语言也是一样的,只要实现了需要的服务接口。并且该文不局限与OWA的研究,还包括Config、XML、Cache、Redis等技术。更重要的是熟悉.Net Core开发。

在OwaFileInfo的SupportsUpdate、UserCanWrite、SupportsLocks属性为true时将允许用户在线编辑文件。

在原有的基础上编辑一个test.xlsx文件,其访问链接为(测试链接没有实际意义):http://owa.test.com/x/_layouts/xlviewerinternal.aspx?edit=1&WOPISrc=http%3a%2f%2f192.168.1.1%2fapi%2fwopi%2ffiles%2ftest.xlsx&access_token=H7lFBYT4pVMK

将弹出如下对话框

点击编辑副本

查看请求日志发现,另存副本请求将调用PutRelativeFile服务,所有我们应该再原来的基础上添加PutRelativeFile服务。

PutRelativeFile服务

PutRelativeFile操作将在主机上创建一个基于当前文件的副本文件,创建成功后必须将副本文件名及URL以Json的格式返回给OWA服务器。

如果OWA客户端设置了CheckFileInfo的SupportsUpdate为true的话,就必须要实现PutRelativeFile服务,否则需要设置UserCanNotWriteRelative为true并且返回501状态码。

Method:POST

URI:HTTP://server/<...>/wopi*/files/<id>

Request Headers:

X-WOPI-Override 固定值 PUT_RELATIVE

X-WOPI-SuggestedTarget 文件扩展名或全名(可修改)

X-WOPI-RelativeTarget 文件全名(不可更改)

X-WOPI-OverwriteRelativeTarget 是否覆盖文件名

X-WOPI-Size 文件的大小bytes

X-WOPI-FileConversion 指示请求是否转换文件

Response Headers:

X-WOPI-ValidRelativeTarget

X-WOPI-Lock

X-WOPI-LockFailureReason

该接口需要返回的Json格式如下:

{Name:”test.xlsx”,Url:” http://server/<...>/wopi/files/ test.xlsx”, HostViewUrl :””, HostEditUrl :””}

说明:Name为新的文件名(如果修改的话),Url为新的文件的CheckFileInfo服务路径。

在线Excel用到这个服务的情况有两种:

1.另存为,如果没有实现PutRelativeFile服务,则另存为将不能使用;

2.当编辑服务器不支持的Excel某些格式的文件时,会先保存一个系统支持格式的副本,如果没有实现PutRelativeFile服务,则不能编辑该Excel(因为保存新文件会失败);

PutRelativeFile服务与CheckFileInfo服务的URL是相同的,只是Method不同,所以我们只需在CheckFileInfo的基础上修改。

        [RouteAttribute("files/{name}")]
public JsonResult GetFileInfo(string name, string access_token)
{
string wopiType = Request.Headers["X-WOPI-Override"];
Console.WriteLine("1.X-WOPI-Override:" + wopiType);
if (wopiType == "PUT_RELATIVE")
{
using (FileStream fs = System.IO.File.Create("Files/new_" + name))
{
Request.Body.CopyTo(fs);
}
Response.Headers.Add("X-WOPI-ValidRelativeTarget", "new_" + name);
Response.Headers.Add("X-WOPI-Lock", Request.Headers["X-WOPI-Lock"]);
Response.StatusCode = ;
PutRelativeFile file = new PutRelativeFile();
file.Name = "new_" + name;
file.Url = "http://b1wcfoqm7r.proxy.qqbrowser.cc/api/wopi/files/new_" + name;
return Json(file);
}
else if (wopiType == "UNLOCK" || wopiType == "LOCK")
{
Response.Headers.Add("X-WOPI-Lock", Request.Headers["X-WOPI-Lock"]);
Response.StatusCode = ;
return Json("");
}
else
{
FileHelper helper = new FileHelper();
var info = helper.GetFileInfo(name);
info.SupportsUpdate = true;
info.SupportsLocks = true;
info.UserCanWrite = true;
return Json(info);
}

GetFileInfo

    [DataContract(Name = "PutRelativeFile")]
public class PutRelativeFile
{
[DataMember(Name = "Name")]
public string Name { get; set; }
[DataMember(Name = "Url")]
public string Url { get; set; }
[DataMember(Name = "HostViewUrl")]
public string HostViewUrl { get; set; }
[DataMember(Name = "HostEditUrl")]
public string HostEditUrl { get; set; }
}

PutRelativeFile

Discovery.xml

访问OWA服务器的如下地址:http://owa.host.com/hosting/discovery(该链接无实际意义)就能得到OWA服务器能够处理的所有文件格式、操作及相关的URL。

<action name="view" ext="xls" default="true" urlsrc="http://owa.hand-china.com/x/_layouts/xlviewerinternal.aspx?<ui=UI_LLCC&><rs=DC_LLCC&>"/>

name=”view”表示动作为查看,ext=”xls”表示文件扩展名为xls,urlsrc则表示相应动作的地址。

以预览test.xls为例,其ChecFileInfo路径为:http://localhost:5000/api/wopi/files/test.xls

则最终预览的链接为:http://owa.host.com/x/_layouts/xlviewerinternal.aspx?WOPISrc=http://localhost:5000/api/wopi/files/test.xls

我将OWA服务提交的discovery内容放到了本地的xml文件中,读取方法如下:

        public static List<DiscoveryAction> GetDiscoveryAction()
{
List<DiscoveryAction> list = new List<DiscoveryAction>();
XmlReader reader = XmlReader.Create("Files/Discovery.xml");
//循环Read方法直到文档结束
while (reader.Read())
{
//Console.WriteLine("rdr.NodeType = " + reader.NodeType);
//如果是开始节点
if (reader.NodeType == XmlNodeType.Element)
{
//通过rdr.Name得到节点名
string elementName = reader.Name; //读取到cat元素 这时rdr.Read()读取到的内容为<cat color="white">
if (elementName == "action")
{
DiscoveryAction act = new DiscoveryAction();
//可以通过中括号获得属性值
act.Name = reader["name"];
act.UrlSrc = reader["urlsrc"];
act.Default = TransBool(reader["default"]);
act.Ext = reader["ext"];
act.ProGid = reader["progid"];
act.Requires = reader["requires"];
list.Add(act);
}
}
}
return list;
}

GetDiscovery

Discovery.xml文件下载:Disconvery

Controller Action代码如下:

        [Route("files/{name}/links")]
[HttpGetAttribute]
public JsonResult GetOwaLinks(string name, string type, string access_token, string lang)
{
if (string.IsNullOrEmpty(type))
{
type = "view";
}
if (string.IsNullOrEmpty(lang))
{
lang = "zh-CN";
}
if (string.IsNullOrEmpty(access_token))
{
access_token = "H7lFBYT4pVMK";
}
List<string> lst = new List<string>();
var res = XmlHelper.GetDiscoveryAction();
var ext = Path.GetExtension(name).TrimStart('.');
var discovery = res.Where(t => t.Ext == ext && t.Name == type);
foreach (var item in discovery)
{
Console.WriteLine(item.UrlSrc);
var index = item.UrlSrc.IndexOf('<');
var api = System.Net.WebUtility.UrlEncode("http://localhost:5000/api/wopi/files/" + name);
lst.Add(string.Format(item.UrlSrc.Substring(, index) + "WOPISrc={0}&access_token={1}&ui={2}", api, access_token, lang));
}
return Json(lst);
}

GetOwaLinks

测试访问:http://localhost:5000/api/wopi/files/test.docx/links

.Net Core集成Office Web Apps(二)的更多相关文章

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

    最近开始学习.Net Core,并使用Visual Studio Code工具来开发.感觉开发起来特别的方便,但是有个头疼的地方:许多的类库被修改了,一时半会儿还熟悉不了,需要查阅官方API... M ...

  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. 微软office web apps 服务器搭建之在线文档预览(二)

    上一篇文章已经介绍了整个安装过程了.只要在浏览器中输入文档转换server的ip,会自动跳转,出现如下页面. 那么就可以实现本地文档预览了,你可以试试.(注意:是本地哦,路径不要写错,类似“\\fil ...

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

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

随机推荐

  1. dedecms调用当前栏目的子栏目怎么操作

    有时我们建网站会建很多分类,每个分类又有小分类,为了让顶级栏目获得更好的权重和排名,我们会聚合子栏目.那么dedecms调用当前栏目的子栏目怎么操作呢? 有两种方法:标签dede:sonchannel ...

  2. C# 序列化(Serialize)与反序列化(Deserialize)

    序列化是将对象的状态信息转换为可保持或传输的格式的过程(一堆字符),比如转化为二进制.xml.json等的过程. 反序列化就是将在序列化过程中所生成的二进制串.xml.json等转换成数据结构或者对象 ...

  3. Python qq企业邮箱发送邮件

    Python qq企业邮箱发送邮件 进入客户端设置: 下面是代码部分: from email.header import Header from email.mime.text import MIME ...

  4. iOS 网易彩票-4设置模块一

    概述 基本上,每一款APP都有相应的设置模块.怎么设置才能更灵活和通用呢,这也是大家一直思考的.下面说说在网易彩票中,设置模块的设置思想. 基本上有三种方案: static cell(呆板,完全没有动 ...

  5. Qt addStretch()详解

    addStretch函数,是在布局的时候用到. 函数原型: void QBoxLayout::addStretch ( int stretch = 0 ) 作用:平均分配Layout 比如: QVBo ...

  6. 172. Factorial Trailing Zeroes(阶乘中0的个数 数学题)

    Given an integer n, return the number of trailing zeroes in n!. Example 1: Input: 3 Output: 0 Explan ...

  7. linux安装composer及安装yii2

    wget https://getcomposer.org/download/1.3.2/composer.phar mv composer.phar /usr/local/bin/composer c ...

  8. eclispe 相关设置

    1. 关闭js文件校验: 1). windows->preference->Java Script->Validator->Errors/Warnings->Enable ...

  9. CentOS安装JDK的三种办法

    方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创建java目录 [root@localhost ~]# mkdir/usr/java[root@localhost ~]# c ...

  10. 浅谈CORS

    浅谈CORS CORS全称"跨站资源共享"(Cross-Origin Resource Sharing),它允许浏览器克服浏览器同源策略向跨域服务器发出请求. 同源策略 概念 说到 ...