當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 上海OA系統(tǒng) > 上海OA信息化
微軟基于Web計(jì)算的框架結(jié)構(gòu)分析
微軟基于Web計(jì)算的框架結(jié)構(gòu)分析
一、引言
隨著Internet的發(fā)展,軟件系統(tǒng)已經(jīng)從客戶服務(wù)器系統(tǒng)發(fā)展到服務(wù)器/瀏覽器系統(tǒng),但是隨著基于Internet應(yīng)用的深化和基于Web計(jì)算的概念的提出,新的計(jì)算模型不再是簡單的依賴于瀏覽器作為客戶端。
首先,我們來簡單看一下計(jì)算模型的發(fā)展歷史,一開始,由于個人計(jì)算機(jī)還尚未普及,而且計(jì)算機(jī)價格都比較昂貴,我們一般采用主機(jī)模式來進(jìn)行計(jì)算,也就是說客戶實(shí)際上是通過終端和大型主機(jī)進(jìn)行連接,主機(jī)分配一定的CPU時間和磁盤空間給用戶,所有用戶的計(jì)算實(shí)際上都是在主機(jī)上完成的。這樣對主機(jī)的要求非常高,要求主機(jī)上的操作系統(tǒng)必須是高度可靠、安全的。在這個時候,流行的是IBM的大型機(jī)的操作系統(tǒng),這里注意的是,即使到現(xiàn)在,很多銀行依然通過這個模式進(jìn)行運(yùn)做,因?yàn)槿菀走M(jìn)行集中管理和維護(hù),客戶端實(shí)際上僅僅是一個終端的功能,從某一個角度講就是主機(jī)屏幕的延伸。
隨著分布式概念的提出和微機(jī)功能的增強(qiáng),軟件業(yè)又提出了客戶/服務(wù)器的計(jì)算模型,把一些非關(guān)鍵的任務(wù)(比如圖形界面的顯示,數(shù)據(jù)的顯示格式確定,數(shù)據(jù)的處理等等)放到客戶端進(jìn)行執(zhí)行,這樣相對就減輕了對服務(wù)器的負(fù)擔(dān)。但是這種模式一般是基于局域網(wǎng)范圍內(nèi)進(jìn)行的(比如在九十年代非常流行的一些基于數(shù)據(jù)庫的信息系統(tǒng)就是根據(jù)這種模式構(gòu)建的)。
隨著Internet的發(fā)展和企業(yè)之間電子交互的需求的出現(xiàn),出現(xiàn)了基于數(shù)據(jù)庫/Web服務(wù)器/瀏覽器這樣的計(jì)算模型,這種模型實(shí)際上是基于全球網(wǎng)絡(luò)范圍內(nèi)進(jìn)行的,客戶端統(tǒng)一的以瀏覽器的形式表現(xiàn)給用戶,用戶通過HTTP協(xié)議把任務(wù)提交給Web服務(wù)器,Web服務(wù)器通過和數(shù)據(jù)庫和應(yīng)用服務(wù)器的交互把結(jié)果通過HTTP協(xié)議傳遞給客戶端,然后客戶端再通過瀏覽器顯示結(jié)果。在這種模式下的關(guān)鍵是數(shù)據(jù)傳遞的安全性和事務(wù)性這兩個問題,因?yàn)镠TTP本質(zhì)是是一個無狀態(tài)的連接,所以事務(wù)處理就變得非常重要,同時因?yàn)檎麄€業(yè)務(wù)是基于全球網(wǎng)絡(luò)體系結(jié)構(gòu)的,所以安全性也變成一個值得關(guān)注的問題。
隨著Internet上計(jì)算任務(wù)的復(fù)雜化和業(yè)務(wù)的多樣化,自然而然就產(chǎn)生了以Web為中心進(jìn)行計(jì)算的需求。從本質(zhì)上說,對Internet應(yīng)用的復(fù)雜化使我們當(dāng)前的操作系統(tǒng)都顯得力不從心,因?yàn)槲覀儺?dāng)前的操作系統(tǒng)一般都是基于單機(jī)或者局域網(wǎng)系統(tǒng)的,而如何把操作系統(tǒng)擴(kuò)展到整個Internet計(jì)算這個范疇內(nèi),就成了所有操作系統(tǒng)軟件生產(chǎn)廠商所必須考慮的問題。
基于Web的軟件系統(tǒng)的例子有很多,比如Napster,它允許在用戶之間進(jìn)行磁盤內(nèi)容的共享,從某一種角度講,它的基本概念是要建立一個基于Web的文件系統(tǒng),這個文件系統(tǒng)包含了所有參與者本身的文件系統(tǒng)。這樣參與者之間就可以進(jìn)行文件的共享,通過輸入一定的查詢條件,我們就可以在其他的用戶的存儲設(shè)備上找到相應(yīng)的文件并進(jìn)行下載(當(dāng)然這種概念在局域網(wǎng)中早就存在,現(xiàn)在Napster把這個概念擴(kuò)展到了整個Internet領(lǐng)域而已)。
二、Web服務(wù)體系結(jié)構(gòu)分析
這種基于Internet類型應(yīng)用的出現(xiàn)使我們需要一個嶄新的框架結(jié)構(gòu)來進(jìn)行程序的設(shè)計(jì),我們需要一個快速和方便的方法進(jìn)行代碼的編寫并且能夠和Internet上其他的程序進(jìn)行交互。當(dāng)然在計(jì)算機(jī)之間進(jìn)行數(shù)據(jù)和信息交互這個概念并不是很新,比如通過RPC,DCOM和CORBA等都可以實(shí)現(xiàn)不同計(jì)算機(jī)上的進(jìn)程之間的交互。但是它們都有一個致命的缺點(diǎn):它們需要進(jìn)行交互的機(jī)器具有相似的系統(tǒng),比如MSMQ只能和MSMQ進(jìn)行對話,DCOM客戶端只能和DCOM服務(wù)器端進(jìn)行交互。
而我們真正需要的是一個通用的開發(fā)框架,也就是說不管系統(tǒng)的那一端是什么東西,我們這一端都可以和它進(jìn)行信息的交互。它的本質(zhì)意義就是說兩端的操作系統(tǒng)不僅可以是異構(gòu)的(比如一端可以是Windows,另一端可以是UNIX),而且實(shí)現(xiàn)的語言也可以是異構(gòu)的(一端可以用C++實(shí)現(xiàn),另一端可以用VB實(shí)現(xiàn))。
如果大家還記得在DCOM進(jìn)行交互時的數(shù)據(jù)列集(Marshal)這個概念的話,那么就可以理解基于Internet異構(gòu)系統(tǒng)通訊的關(guān)鍵點(diǎn)是什么了。一個就是通訊的標(biāo)準(zhǔn),兩個進(jìn)程需要采用標(biāo)準(zhǔn)的協(xié)議進(jìn)行通訊,另外一個就是數(shù)據(jù)的打包,數(shù)據(jù)應(yīng)該采用一致的形式進(jìn)行打包和解包。當(dāng)前基于Internet最流行的傳輸協(xié)議就是HTTP,所有的Web瀏覽器都通過這個協(xié)議和Web服務(wù)器進(jìn)行通訊并得到相關(guān)的網(wǎng)頁。而數(shù)據(jù)的打包也需要采用一定的標(biāo)準(zhǔn),當(dāng)前出現(xiàn)的跨平臺的信息編碼的標(biāo)準(zhǔn)就是XML。因?yàn)镠TTP和XML都是工業(yè)的標(biāo)準(zhǔn),并不和任何平臺,廠商掛鉤,所以基于這兩種標(biāo)準(zhǔn)構(gòu)建的系統(tǒng)無疑在任何環(huán)境是都是有生命力的。
為了創(chuàng)建一個Web服務(wù),我們所需要做的工作就是編寫一個.Net服務(wù)對象,使它被異地進(jìn)程的調(diào)用就象能夠被本地的客戶端直接調(diào)用一樣。實(shí)際上是通過給它標(biāo)記一定的屬性來實(shí)現(xiàn)的,使它能夠被Web客戶端所使用。通過ASP.NET,這個.Net服務(wù)對象就能夠接受來自客戶端的請求(通過HTTP協(xié)議傳輸?shù)模?。也就是說.Net服務(wù)對象能夠和任何使用HTTP和XML標(biāo)準(zhǔn)的進(jìn)程進(jìn)行通訊,你也不需要考慮Web通訊的體系結(jié)構(gòu),操作系統(tǒng)已經(jīng)幫你搞定了這一切。
從服務(wù)對象的角度來講,一個客戶和服務(wù)對象之間的通訊可以用下面的形式表示:
1. 從客戶端的HTTP請求到達(dá),其中參數(shù)可能包含在URL中,也可能包含在一個單獨(dú)的XML文件中
2.
ASP.NET根據(jù).asmx文件的指定創(chuàng)建對象
3. ASP.NET調(diào)用對象的某一個特定的方法
4. 對象把結(jié)果返回給ASP.NET
在客戶端,.NET提供了Proxy類用來快速方便的和服務(wù)器提供的Web服務(wù)進(jìn)行交互,通過開發(fā)工具得到Web服務(wù)的描述,然后就可以產(chǎn)生一個包含一些功能函數(shù)的Proxy類,注意,在這里我們可以使用任何類型的語言來開發(fā)客戶端,當(dāng)客戶端調(diào)用其中的某一個函數(shù)的時候,Proxy就會產(chǎn)生一個HTTP請求并把它發(fā)送給服務(wù)器,當(dāng)服務(wù)器響應(yīng)返回的時候,Proxy能夠?qū)Y(jié)果進(jìn)行解析并返回給調(diào)用該函數(shù)的客戶端。這樣,就保證了客戶端能夠通過HTTP和XML無縫的和Web服務(wù)器進(jìn)行信息的交互。
從客戶端的角度來講,一個客戶和服務(wù)對象之間的通訊可以用下面的形式表示:
1. 在運(yùn)行時刻,客戶端產(chǎn)生一個Proxy對象
2. 客戶端調(diào)用Proxy中的一個方法
3. Proxy把調(diào)用轉(zhuǎn)換成HTTP和XML形式,并通過Internet發(fā)送到服務(wù)器端
4. Proxy通過HTTP協(xié)議得到以XML形式表現(xiàn)的結(jié)果,并轉(zhuǎn)化成相應(yīng)的結(jié)果值返回給客戶
三、Web服務(wù)的編寫
這里我們可以寫一個最簡單的Web服務(wù)來說明這種新技術(shù)的使用,該Web服務(wù)以字符串的形式提供當(dāng)前的服務(wù)器的時間(可以精確也可以不精確到秒)。程序是以標(biāo)準(zhǔn)的標(biāo)記符"<%@...%>"開始的,在該標(biāo)記符內(nèi),WebService告訴ASP.NET該頁的代碼是作為一個Web服務(wù)出現(xiàn)的。Language告訴ASP編譯這個頁所使用的語言是VB,然后ASP.NET就會使用Visual Basic.NET來進(jìn)行代碼的編譯。CLASS屬性告訴ASP.NET當(dāng)前類對象的名稱為TimeService。
具體的代碼如下:
<%@ WebService Language="VB" Class="TimeService"%>
' 引入名字空間' 需要Web Service
Imports System
Imports
System.Web.Services
' 建立一個新的類,該類必須繼承系統(tǒng)提供的基類WebService
Public
Class TimeService : Inherits WebService
'在類中建立我們所需要的函數(shù),并標(biāo)記為WebMethods
Public Function <WebMethod()> GetTime (ShowSeconds as Boolean) As
String
' 完成該函數(shù)的功能:發(fā)現(xiàn)當(dāng)前的時間,格式化,并以字符串形式返回
Dim dt as DateTime
If (ShowSeconds = TRUE) Then
GetTime =
dt.Now.ToLongTimeString
Else
GetTime =
dt.Now.ToShortTimeString
Endif
End Function
End
Class
為了允許開發(fā)人員使用Web服務(wù)來開發(fā)客戶端應(yīng)用,需要在設(shè)計(jì)和開發(fā)的時候給他們提供一定的信息。比如,一個Web服務(wù)的客戶端需要知道Web服務(wù)所暴露的方法和相關(guān)的參數(shù)以及所支持的協(xié)議,這個和一個標(biāo)準(zhǔn)的COM所攜帶的類型庫的概念很類似。但是類型庫是COM所專用的,而我們所提供的方法應(yīng)該是和具體的體系結(jié)構(gòu)無關(guān)的,所以需要編寫一個通用的服務(wù)方法的描述。ASP.NET提供了一個可描述的服務(wù),當(dāng)編譯一個WEB服務(wù)的時候,ASP.NET提供了一個文件列表用來說明服務(wù)所支持的協(xié)議,它所提供的方法和參數(shù)等等。這個文件是 XML形式編碼并使用稱為SDL(Service Descriptor Language)的語言進(jìn)行描述的??梢酝ㄟ^http://WebServer/ specifiedDirectory /TimeService.asmx?SDL這樣的形式來得到SDL語言。
當(dāng)我們用VB或者VC來編寫COM組件的時候,我們一般需要編寫一個類型庫來描述該COM組件所能提供的功能,而對ASP.NET來說,它能夠自動的生成一個SDL文件,也可以先編寫一個SDL文件,然后通過系統(tǒng)工具生成一個服務(wù)的模板文件。
一個典型的SDL文件具體內(nèi)容如下:
<!-- 標(biāo)準(zhǔn)的XML頭,描述版本信息和其他相關(guān)信息-->
<?xml
version="1.0"?>
<!-- 元素serviceDescription是文件的根節(jié)點(diǎn),里面的內(nèi)容是對Web服務(wù)的描述
-->
<!-- 值TimeService表示服務(wù)的名稱 -->
<serviceDescription
name="TimeService">
<!--
元素serviceDescription包括兩個子元素,一個是協(xié)議描述,另外一個是文檔的schema描述
-->
<!-協(xié)議描述用來告訴客戶端開發(fā)人員我這個Web服務(wù)所支持的協(xié)議,并告訴他請求和響應(yīng)數(shù)據(jù)的編碼格式
-->
<!-這里我們描述了HTTP GET的操作,一般有三種方法HTTP GET,HTTP POST和SOAP三種方法
-->
<httpget>
<service>
<requestResponse name="GetTime"
href="http://WebServer/specifiedDirectory/TimeService.asmx/GetTime">
<request>
<param
name="ShowSeconds"/>
</request>
<response>
<mimeXml
ref="s1:string"/>
</response>
</requestResponse>
</service>
</httpget>
<!- 這里可以對其他的協(xié)議進(jìn)行描述,比如httpget 和 soap ->
<!-
schema表示對服務(wù)的抽象定義,它和采用什么協(xié)議和它進(jìn)行通訊無關(guān) ->
<!- 它實(shí)際上包含了對服務(wù)包含的函數(shù)的名稱,參數(shù)和返回值的表示
->
<schema>
<element name="GetTime">
<complexType>
<element name="ShowSeconds" type="boolean"/>
</complexType>
</element>
<element
name="GetTimeResult">
<complexType>
<element name="result"
type="string" nullable="true"/>
</complexType>
</element>
</schema>
</serviceDescription>
四、Web服務(wù)的客戶端的編寫
現(xiàn)在讓我們來看一下如何編寫客戶端的代碼。我們知道ASP.NET實(shí)際上是在偵聽三種類型的數(shù)據(jù)包,它們包括HTTP GET,HTTP POST和SOAP。
1.采用HTTP GET的方法:
其基本格式如下:
http://webserver/specifiedDirectory/timeservice.asmx/GetTime?ShowSeconds=TRUE
2.采用HTTP POST的方法:
實(shí)際上就是通過HTML的FORM格式來發(fā)送請求,其主要的代碼如下
<form METHOD="POST" ACTION=" http://webserver/specifiedDirectory/timeservice.asmx/GetTime">
<p>是否顯示秒?</p>
<blockquote>
<p> <input
TYPE="RADIO" NAME="ShowSeconds" VALUE="True" CHECKED>
True
<input TYPE="RADIO" NAME="ShowSeconds"
VALUE="False">False<br>
</p> </blockquote>
<input TYPE="SUBMIT"
VALUE="Submit Form">
<input TYPE="RESET" VALUE="Reset
Form">
</form>
3.采用SOAP的方法:
服務(wù)器接受通過HTTP POST請求發(fā)送的數(shù)據(jù)包,數(shù)據(jù)包以一個SOAP包的格式保存。注意這里的SOAP包實(shí)際上是一個XML文檔,SOAP包中包含了函數(shù)的名稱和相關(guān)的參數(shù),當(dāng)SOAP包達(dá)到服務(wù)器的時候,APS.NET可以識別這個SOAP包,然后提取包中所包含的方法和相應(yīng)的參數(shù)并創(chuàng)建這個對象,然后執(zhí)行對該方法的調(diào)用。并把結(jié)果以XML文檔的形式返回到客戶端。這里的關(guān)鍵是合成一個有效的SOAP包,并對返回的XML文檔進(jìn)行有效的信息提取。
這里我們可以用如下的VB代碼來實(shí)現(xiàn)基于SOAP的客戶端。
Private Const QuoteTemplate =
"<?xml version=""1.0""?>
<Envelope xmlns = ""http://schemas.xmlsoap.org/soap/envelope/"" >
<Body>
<GetTime xmlns:xsi=""http://www.w3.org/1999/XMLSchema-instance""
xmlns=""http://tempuri.org/main.xsd"">
<ShowSeconds>true</ShowSeconds>
</GetTime>
</Body>
</Envelope>"
Private Sub btnGetTime_Click()
' 建立DOM對象
Dim parser As New DOMDocument
'
裝載XML文檔模板
parser.loadXML (QuoteTemplate)
' 設(shè)置參數(shù)ShowSeconds的值
If (Check1.Value = 0) Then
parser.selectSingleNode("/Envelope/Body/GetTime/ShowSeconds").Text =
"false"
Else
parser.selectSingleNode("/Envelope/Body/GetTime/ShowSeconds").Text =
"true"
End If
' 把XML文檔的內(nèi)容放到EDIT控件txtSend中
txtSent.Text = parser.xml
' 使用Microsoft Internet transfer 控件執(zhí)行HTPP POST操作
Inet1.Execute
txtURL.Text, "POST", parser.xml, "Content-Type: text/xml" + vbCr + vbLf
+"SOAPAction: http://tempuri.org/GetTime"
End
Sub
' 控件Inetl1的消息觸發(fā)處理
Private Sub Inet1_StateChanged(ByVal State As Integer)
If (State = 12) Then
' 讀取從服務(wù)器端返回的數(shù)據(jù)
Dim bar As String
bar =
Inet1.GetChunk(4096)
' 把服務(wù)器端返回的數(shù)據(jù)存放到EDIT控件txtReceived中
txtReceived.Text = bar
' 把返回的字符串存放到XML文檔中
Dim
DocIn As New DOMDocument
DocIn.loadXML (bar)
'
利用DOM模型得到元素price的值
Dim Price As IXMLDOMNode
Set Price =
DocIn.selectSingleNode("SOAP:Envelope/SOAP:Body/GetStockQuoteResponse/price")
If (Price Is Nothing) Then
txtPrice = "(error)"
Else
txtPrice = Price.Text
End If
End
If
End Sub
4.通過智能的SOAP代理進(jìn)行操作
這種方法需要使用Visual Studio.NET開發(fā)工具,程序通過SDL文件讀取對Web服務(wù)的描述并產(chǎn)生一個Proxy(注意這個Proxy可以使用一定的工具自動產(chǎn)生),該P(yáng)roxy繼承了基類Web.Services.Protocols.SoapClientProtocol。Proxy類包含了一個屬性稱為Path,這個屬性指出服務(wù)器的URL地址,它包含一個從SDL文件中得到的缺省的值,客戶端通過方法Invoke來激活Proxy中的方法(比如A),該方法(A)然后創(chuàng)建一個SOAP包,包中包含了方法的名稱和參數(shù),然后通過HTTP協(xié)議把它發(fā)送給服務(wù)器。當(dāng)SOAP響應(yīng)包從服務(wù)器中返回的時候,基類就對返回的值進(jìn)行解析并把它返回給Proxy,再由Proxy返回給客戶。然后你可以使用具體的語言來操作這個Proxy,當(dāng)前支持的語言有Visual Baisc.NET,C#和JavaScript,但不支持C++。
下面是用VB.NET編寫的和Proxy進(jìn)行交互的代碼:
Public Class Form1 Inherits System.WinForms.Form
'
當(dāng)點(diǎn)擊按紐GetTimeSynch時的處理(同步處理)
Protected Sub btnGetTimeSynch_Click(ByVal
sender As System.Object, ByVal e As System.EventArgs)
'
產(chǎn)生一個新的Proxy類的對象實(shí)例
Dim ThisTimeServiceProxy As New TimeService()
' 設(shè)置由用戶指定的屬性Path的值
ThisTimeServiceProxy.Path =
TextBox2.Text
' 實(shí)際調(diào)用方法,并把結(jié)果返回到文本框中
'
CheckBox1的值表示方法GetTime的參數(shù)值
TextBox1.Text =
ThisTimeServiceProxy.GetTime(CheckBox1.Checked)
End Sub
Dim AsyncTimeServiceProxy As TimeService
Dim AsyncResult
As IAsyncResult
' 當(dāng)點(diǎn)擊按紐GetTimeASynch時的處理(異步處理)
Protected Sub
btn_BeginGetTimeAsync_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs)
AsyncTimeServiceProxy = New TimeService
AsyncResult =
AsyncTimeServiceProxy.BeginGetTime(CheckBox1.Checked, Nothing,
Nothing)
End Sub
' 檢查當(dāng)前的操作是否結(jié)束
Protected Sub
btnPollForComplete_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs)
If (AsyncResult.IsCompleted) Then
MsgBox("Complete")
Else
MsgBox("Not
Complete")
End If
End Sub
' 得到采用異步方法調(diào)用所得到的結(jié)果
Protected Sub btnEndGetTimeAsync_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)
TextBox1.text =
AsyncTimeServiceProxy.EndGetTime(AsyncResult)
AsyncTimeServiceProxy =
Nothing
End Sub
End Class
我們知道,基于Internet的計(jì)算環(huán)境要比基于桌面的環(huán)境要復(fù)雜的多,而且交互時間也要長的多,比如對一個最簡單的Web服務(wù)的調(diào)用可能就要花費(fèi)5到10秒甚至更長的時間,而在這個時候你不能指望用戶愿意傻乎乎的一直等在那里。換句話說,因?yàn)樽烂娼换r間非常短,我們可以采用同步調(diào)用的方法來調(diào)用組件的一個方法,但是在基于Internet計(jì)算的時候,我們必須采用異步調(diào)用的方法。
上面的VB.NET代碼中也演示了異步調(diào)用的方法,實(shí)際上Proxy本身就包含了一個方法稱為Beginmethodname,就我們具體例子而言就是BeginGetTime,調(diào)用這個方法以后,程序會立刻返回,然后可以做其他想做的事情,等你需要看結(jié)果的時候,你需要調(diào)用方法Endmethodname,然后得到結(jié)果。當(dāng)然如果在結(jié)果沒有返回前你調(diào)用方法Endmethodname的話,程序就會阻塞直到從服務(wù)器中得到結(jié)果。為了防止整個界面處于阻塞狀態(tài),實(shí)際實(shí)現(xiàn)的時候,你可以在一個工作者線程中調(diào)用Endmethodname方法。
五、結(jié)論
實(shí)際上,幾乎所有的編程人員都希望編寫能在Internet上進(jìn)行交互的程序,而不管他們的運(yùn)行平臺到底是什么。而通過使用HTTP和XML技術(shù),我們基本上就能夠達(dá)到這個功能。客戶端只要把數(shù)據(jù)以XML的形式進(jìn)行打包,以HTTP形式進(jìn)行傳送,服務(wù)器端就能夠進(jìn)行處理,而在服務(wù)器端,它通過創(chuàng)建一個SDL文件來描述服務(wù)對象所能夠提供的方法和參數(shù),這樣客戶端就可以正確的對服務(wù)對象進(jìn)行調(diào)用。同時,一個Proxy的生成器提供了一個到達(dá)Web服務(wù)的函數(shù)集,使客戶端程序編寫的工作變的更加簡單。
需要說明的是,微軟即將推出的Visual Studio.NET這套開發(fā)工具提供了開發(fā)Web服務(wù)的集成環(huán)境,而這種Web服務(wù)的體系結(jié)構(gòu)同時也對Web應(yīng)用提供了安全級別,這些工具使開發(fā)人員能夠快速有效的構(gòu)建基于Internet的應(yīng)用系統(tǒng)。
- 1企業(yè)上海OA信息化創(chuàng)新探析
- 2軟件服務(wù)時代的來臨
- 3上海環(huán)境集團(tuán)辦公OA信息系統(tǒng)
- 4泛普軟件OA小助手可以實(shí)現(xiàn)和網(wǎng)頁版OA的無縫集成
- 5OA辦公系統(tǒng)有其特殊性,又具有管理軟件的共性
- 6知識分析師和知識主管的區(qū)別
- 7知識時代的企業(yè)——創(chuàng)建21世紀(jì)的組織
- 8上海OA信息化與創(chuàng)新
- 9Sun 擁有Java, 但是它的Web Service 在哪里?
- 10經(jīng)營知識
- 11知識社區(qū)主要表現(xiàn)形式
- 12上海電力安裝第一工程公司OA辦公自動化系統(tǒng)-登錄
- 13Web服務(wù)發(fā)展中的一些問題
- 14上海OA信息化“人-過程-技術(shù)”三個層面的關(guān)鍵指標(biāo)
- 15會議跟蹤、公告欄應(yīng)用辦公自動化軟件OA系統(tǒng)
- 16企業(yè)論壇、短信提醒、設(shè)置等模塊組成OA辦公系統(tǒng)
- 17以移動OA辦公系統(tǒng)來改變用戶的移動應(yīng)用產(chǎn)品矩陣
- 18上海OA信息化實(shí)施中的PDCA循環(huán)
- 19上海OA市場過去、未來
- 20使用Visual Basic或C#創(chuàng)建Web Service
- 21泛普OA成功實(shí)施的保障
- 22競爭情報和上海OA信息化的融合
- 23如何審核知識?
- 24建筑設(shè)計(jì)企業(yè)的上海OA信息化
- 25微軟IBM拋開宿怨聯(lián)手打造Web新標(biāo)準(zhǔn)
- 26泛普OA軟件給大眾的印象正是實(shí)用、易用、開放
- 27上海市奉賢中等專業(yè)學(xué)校辦公OA系統(tǒng)
- 28隱性知識轉(zhuǎn)化是知識創(chuàng)新的基礎(chǔ)
- 29OA協(xié)同系統(tǒng)的啟用與完善,將加快實(shí)現(xiàn)特檢院辦公先進(jìn)性
- 30有生命力的上海OA信息化
成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓
泛普上海OA信息化其他應(yīng)用
上海OA軟件 上海OA新聞動態(tài) 上海OA信息化 上海OA快博 上海OA軟件行業(yè)資訊 上海軟件開發(fā)公司 上海門禁系統(tǒng) 上海物業(yè)管理軟件 上海倉庫管理軟件 上海餐飲管理軟件 上海網(wǎng)站建設(shè)公司
版權(quán)所有:泛普軟件 渝ICP備14008431號-2 渝公網(wǎng)安備50011202501700號 咨詢電話:400-8352-114