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開發或集羣方式部署。