PageOffice的并发控制功能用来解决多个用户在线编辑同一篇文档可能形成的互相覆盖修改结果的技术难题。数据库
B/S架构下用户访问都是并发的,也就是说常常会出现同时N个用户对一个服务器页面发出请求,这就有可能同一个文档被多个用户同时打开进行编辑。为何会出现互相覆盖呢?举个简单例子,例如A用户先访问页面打开了一个文档开始编辑,这时B用户访问相同的页面打开了同一个文档也开始编辑,B用户可能很快就完成了文档修改工做而且保存到服务器。随后A用户也完成了工做并保存文档到服务器。这时,服务器上的这个文档已经变成了A用户修改的最后结果,B用户的修改被A的保存操做覆盖从而消失了。服务器
PageOffice的并发控制可以保证同一时间同一篇文档只能由一我的打开,而这样复杂的控制只须要开发者简单对TimeSlice属性赋值便可实现。不管打开的文档是存放在数据库仍是存在物理磁盘里,只要对此文档设置了并发控制,那么实现的效果都是只有当前用户能够对此文档进行编辑、保存等操做,其余用户只能以只读的形式打开。在并发控制期间,其余用户有三个选择,分别是“终止”、“重试”和“忽略”。选择“终止”,则关闭当前提示对话框,对此文档不进行任何操做;选择“重试”,则能够了解当前操做用户的编辑时间是否已经用完,同时能够看到当前操做用户的剩余编辑时间;选择“忽略”,则以只读方式打开此文档,即只能阅读此文档,不能对此文档进行编辑、修改、保存等操做。架构
在WebOpen以前设置属性TimeSlice。例如设置PageOfficeCtrl1.TimeSlice = 4;那么登陆用户对这个文档的编辑时间即为4分钟。用户必须在编辑时间结束以前,进行编辑、保存等操做,在编辑时间结束以后,用户已经编辑的未保存的内容将没法保存。
PageOfficeCtrl1.TimeSlice = 4;//对当前文档开启并发控制
TimeSlice只对当前WebOpen打开的文档有效,若是不赋值,就不进行并发控制。默认值是0,表示不进行并发控制。并发
注意:url
- 这里所说的同一份文档,以WebOpen的第一个参数为判断标准。若是两次WebOpen的第一个参数彻底相同则视为同一个文档,若是不一样则视为不一样文档。
- 若是两次WebOpen的第一个参数彻底相同,第三个参数(用户名)也彻底相同,则视为用户修改编辑文档的同时参考原来的文件,属于特殊须要,这时并发控制不起做用。
WebOpen直接打开文档或打开动态页面输出的文档,均可以实现并发控制:
(1)直接打开文档,WebOpen的第一个参数是office文件名结尾。
例如用户a的打开文档的操做以下:spa
PageOfficeCtrl1.TimeSlice = 4; PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "a");
用户b的打开文档的操做以下:code
PageOfficeCtrl1.TimeSlice = 4; PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "b");
那么若是对doc/abc.doc这个文档设置了并发控制的话,当a打开此文档后,b只能以只读方式打开此文档,直到a的控制时间结束后,b才能够对此文档进行编辑。
(2)经过动态页面打开文档,WebOpen的第一个参数是一个动态页面的地址,还带有参数值。
例如用户a的打开文档的操做以下:开发
PageOfficeCtrl1.TimeSlice = 4; PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "a");
用户b的打开文档的操做以下:文档
PageOfficeCtrl1.TimeSlice = 4; PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "b");
那么若是对这个a.aspx?id=1地址下载的文档设置了并发控制的话,当a打开此文档后,b只能以只读方式打开此文档,直到a的控制时间结束后,b才能够对此文档进行编辑。部署
同一个office文件,有两个不一样的url地址均可如下载这个文件,当两个用户使用不一样的地址打开同一个office文件的时候,并发控制就不起做用了。
(1)例如都是两个不一样的动态页面地址均可如下载同一个文件:地址a.aspx?id=1和地址b.aspx?id=1下载的是服务器端同一个文档,用户a的打开文档的代码是:
PageOfficeCtrl1.TimeSlice = 4; PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType.docAdmin, "a");
用户b的打开文档的代码是:
PageOfficeCtrl1.TimeSlice = 4; PageOfficeCtrl1.WebOpen("b.aspx?id=1", PageOffice.OpenModeType. docAdmin, "b");
这样虽然“a.aspx?id=1”和“b.aspx?id=1”打开的是同一个文档,可是由于WebOpen的第一个参数值不一样,对于PageOffice来讲打开文档的URL也不一样,PageOffice认为是两个不一样的文件,这种状况并发控制就不起做用了。
(2)例如一个用动态页面地址和一个用文档名结尾的URL地址:访问“a.aspx?id=1”下载的文件就是doc/abc.doc,用户a的打开文档的代码是:
PageOfficeCtrl1.TimeSlice = 4; PageOfficeCtrl1.WebOpen("a.aspx?id=1", PageOffice.OpenModeType. docAdmin, "a");
用户b的打开文档的代码是:
PageOfficeCtrl1.TimeSlice = 4; PageOfficeCtrl1.WebOpen("doc/abc.doc", PageOffice.OpenModeType. docAdmin, "b",);
仍是由于WebOpen的第一个参数值不一样,虽然打开的是同一个文档,可是由于PageOffice认为两个文档的URL不同,因此并发控制也不起做用。
注:此功能不支持PHP开发或集群方式部署。