《面向服務的計算和web數據管理》課件第3章_第1頁
《面向服務的計算和web數據管理》課件第3章_第2頁
《面向服務的計算和web數據管理》課件第3章_第3頁
《面向服務的計算和web數據管理》課件第3章_第4頁
《面向服務的計算和web數據管理》課件第3章_第5頁
已閱讀5頁,還剩223頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章面向服務軟件開發(fā)概要3.1面向服務的軟件開發(fā)環(huán)境綜述

3.2服務提供商:創(chuàng)建和托管服務

3.3服務中介:服務的發(fā)布和發(fā)現

3.4SOAP3.5WSDL:Web服務描述語言

3.6服務請求者:用服務構建應用

3.7基于Java的Web服務開發(fā)

3.8討論

到現在為止,我們有可能掌握了SOC的主要概念和技術,而沒有實際開發(fā)SOC軟件,如果我們去開發(fā)SOC軟件,即使只是創(chuàng)建合成的服務和應用,也會發(fā)現實際開發(fā)和理論的巨大差別。面向服務軟件開發(fā)概要本章將重點介紹如何使用工具開發(fā)SOC軟件,而不涉及底層語言、協(xié)議和標準,因此主要負責大型編程的軟件工程師和項目經理能夠理解本章。本章的目的是讓讀者通過有限的編碼深刻理解相關的概念和技術。如果你是一位經驗豐富的程序員,你可以在學習完本章之后,用相關的概念、技術和資源開發(fā)實際的應用。

本章把主要概念、技術和工具結合在一起,展示如何一步一步創(chuàng)建Web服務,發(fā)布服務并組合成SOC應用。本章的結構如下:3.1節(jié)概述了不同的SOC軟件開發(fā)環(huán)境;3.2節(jié)研究如何使用C#和ASP.Net創(chuàng)建具有標準接口的與平臺無關的Web服務,還討論了不同的服務托管機制,以及如何使用Internet信息服務(IIS)托管服務;3.3節(jié)探討了應用共有的UDDI、ebXML以及其他服務目錄和注冊中心發(fā)布和發(fā)現服務;3.4節(jié)討論用我們自己的服務以及通過公有服務目錄發(fā)現的服務構建虛擬應用和真實應用;最后,在3.5節(jié),我們解釋了如何使用Java和Eclipse開發(fā)環(huán)境創(chuàng)建Web服務。

許多面向服務的軟件開發(fā)環(huán)境都可用于創(chuàng)建Web服務、服務目錄以及使用現有服務構建應用。表3.1列出了一些這樣的開發(fā)環(huán)境,其特點以及這些環(huán)境中使用的主要語言。表中前五個開發(fā)環(huán)境來自微軟,其他的開發(fā)環(huán)境來自Java和BPEL社區(qū),包括IBM、Oracle

、SunMicrosystems。3.1面向服務的軟件開發(fā)環(huán)境綜述

表3.1面向服務的軟件開發(fā)環(huán)境續(xù)表

與平臺無關的Web服務是SOC應用的基石,并得到大部分環(huán)境的支持。

如果應用僅限于一個平臺,則與平臺相關的服務就是更合理的選擇,例如.Net或JEE。在這種情況下,沒有不同接口之間的轉換,與開發(fā)平臺相關的服務更有效率。.Net的遠程調用就是為了滿足上述目標而設計的。JEE既可用于開發(fā)標準的Web服務,也可用于開發(fā)Java相關的組件,例如JavaBeans。

分布式事務確保了兩個商業(yè)伙伴間的事務,比如從一個賬戶到另一個賬戶的轉帳事務,或者能順利完成,或者當事務失敗時不做任何更改。在事務處理中,回滾通常用于從失效中恢復。

WS

*規(guī)范包括許多可信性標準,例如WS

Security和WS

Reliable消息。

這些環(huán)境支持的特征是不斷演化的,新的特征不斷地添加到環(huán)境中。因此,表3.1沒有給出環(huán)境支持的所有特征。

在.Net2008中,WCF(Windows通信基礎)是微軟的一個支持所有特征的包容環(huán)境。但是,如果主要關注與平臺無關的Web服務和應用的開發(fā),則使用ASP.Net更簡單、更容易。在本章的剩余部分,我們將用ASP.Net開發(fā)與平臺無關的Web服務(作為一個服務提供者),討論支持服務發(fā)布和發(fā)現的服務中介,研究用與平臺無關的Web服務構建基于ASP.Net的應用。最后簡要討論基于Java的Web服務開發(fā)環(huán)境。

基于BPEL的SOC軟件開發(fā)和開發(fā)環(huán)境將在后面的章節(jié)研究。

Web服務是平臺無關的。但是,執(zhí)行實際計算(工作)的服務軟件必須用特定的編程語言編寫。換句話說,Web服務是一個接口,它把用標準服務描述語言(例如,WSDL)描述的服務調用(遠程調用)轉換為編寫服務軟件的編程語言的函數調用(例如,C?;騄ava),如圖3.1所示。3.2服務提供商:創(chuàng)建和托管服務

圖3.1服務調用轉換成函數調用

原則上,我們可以用標準的WSDL接口手工包裝任何函數,這將在第5章中討論。本章使用工具自動生成XML格式的WSDL接口文件。這類似于寫一個網頁。你可以直接使用HTML語言寫網頁,也可以使用Web自動生成工具。

我們首先用C#和.Net開發(fā)Web服務。所需的系統(tǒng)和工具包括:

(1)操作系統(tǒng)??梢允褂孟铝胁僮飨到y(tǒng)之一:

①WindowsXP專業(yè)版;

②WindowsVista和7商業(yè)版;③Windows服務器2003、2008或更高版本;

④如果使用基于英特爾處理器的Mac,可以創(chuàng)建一個Windows分區(qū)。

(2)IIS(Internet信息服務),這是WindowsXP的一個可選組件。如果你沒有安裝,則需要添加這個組件。在Vista和7中,IIS是自動安裝的,但是,需要按以下步驟打開它:

①打開控制面板,選擇“程序”;

②選擇“程序和特征”;

③在左邊的菜單中選擇“打開或關閉Windows特征”;

④打開IIS。

一旦安裝了IIS,你應該會看到一個名為inetpub的文件目錄。在inetpub中有一個名為wwwroot的子目錄,它是計算機上托管你創(chuàng)建的Web服務的小型服務器。也可以在wwwroot目錄下創(chuàng)建一個虛擬目錄,該虛擬目錄和保存你的Web服務可執(zhí)行代碼的物理目錄相連接。

(3)VisualStudio.Net專業(yè)版2005或2008,也可以使用.NetC#速成版,可以在微軟的網站/vstudio/express/免費下載。請注意,如果使用XP,在安裝.Net之前必須安裝IIS。因為根據計算機是否正在運行IIS,.Net的配置將有所不同。3.2.1使用ASP.Net創(chuàng)建Web服務

ASP.Net是VisualStudio和.Net框架公共語言運行庫(CLR)內置的編程模板,它用于在服務提供者的服務器站點創(chuàng)建單個的Web服務,也可以在客戶端創(chuàng)建使用Web服務的Windows窗體應用和Web應用。ASP.Net的Web服務教程可以在網站http://www.asp.Net/下載。

類似于創(chuàng)建C++或C#編程項目(Chen,2006),可以按如下步驟創(chuàng)建一個C#和ASP.Net的Web服務模板:

(1)在VisualStudio.Net的“文件”菜單中選擇“新建”—“網站...”,打開一個對話窗口。

(2)選擇“ASP.NetWeb服務”作為模板。在對話窗口的下半部分,選擇你要用來開發(fā)服務的語言。我們可以使用VisualBasic、VisualC#和VisualJ#(Java)。在本節(jié)我們將使用C#。在對話窗口的下半部分,你可以選擇或輸入一個文件系統(tǒng)目錄(硬盤驅動器),用來存放開發(fā)的Web服務。例如,如果鍵入[C:\myService],開發(fā)的服務名為Service.asmx,則這個服務位于此目錄下。VisualStudio附帶了一個開發(fā)服務器,它允許你把服務放在任何地方并測試運行該服務。點擊確定,一個新的Web服務項目以及相關的一些文件將被創(chuàng)建。

(3)服務模板在Service.cs文件中給出,服務中HelloWorld()的[WebMethod]的示例代碼如下所示。

usingSystem;

usingSystem.Linq;

usingSystem.Web;

usingSystem.Web.Services;

usingSystem.Web.Services.Protocols;

usingSystem.Xml.Linq;

[WebService(Namespace="/")]

[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile11)]

//ToallowthisWebServicetobecalledfromscript,usingASP.NetAJAX,uncommentthefollowingline.

//[System.Web.Script.Services.ScriptService]

publicclassService:System.Web.Services.WebService

{

publicService(){

//Uncommentthefollowinglineifusingdesignedcomponents

//InitializeComponent();

}

[WebMethod]

publicstringHelloWorld(){

return"HelloWorld";

}

}

選擇.Net菜單命令“調試—不調試開始執(zhí)行”,將產生一個顯示服務的Web頁,如圖3.2所示。在地址部分,localhost:51783顯示了開發(fā)服務器中服務所在的位置。

圖3.2顯示服務的Web頁

你可以修改[WebMethod]實現自己的功能,或添加更多的Web方法實現更多的功能。一旦你在模板中添加了代碼,就可以使用VisualStudio提供的工具編譯/構建項目、調試代碼、執(zhí)行代碼。最后一步將啟動Web服務。

你仍然必須手工編寫你的服務中的代碼以執(zhí)行服務所需的操作,例如執(zhí)行排序、加密、方程求解等等。然而,ASP.Net提供了一個帶有預定義名字空間和類的模板幫助用戶編寫Web服務中的操作。下面代碼顯示在模板中添加了兩個Web方法(突出顯示的

代碼

)。publicclassService:System.Web.Services.WebService

{

publicService(){

//Uncommentthefollowinglineifusingdesignedcomponents

//InitializeComponent();

}

[WebMethod]

publicstringHelloWorld(){

return"HelloWorld";

}

[WebMethod]//Thisismynewfunctiontoreturnpivalue

publicdoublePiValue()

{

doublepi=System.Math.PI;//calllibfunctionPI

return(pi);

}

[WebMethod]//Thisismynewfunctiontoreturnabsolutevalue

publicintabs(intx)

{

if(x>=0)return(x);

elsereturn(-x);

}

}

程序模板在開始列出了在Web服務中使用的名字空間。在這個例子中,不是所有列出的名字空間都是必要的。添加兩個操作后,這個Web服務有三種Web方法;如果它部署到能使用Web的服務器上,每種方法都提供了一個Web操作。這三個Web服務在Service類定義:

stringHelloWorld()服務簡單地返回一個字符串“HelloWorld”。

doublePiValue()服務返回一個表示pi的double值,例如,

3.14159265358979

。在C#中,pi值由System.Math.PI的庫函數計算。

intabs(intx)服務需要一個整數作為輸入值,并返回一個整型值,即x的絕對值。如果x為非負整數,它返回x,否則,它返回-x。3.2.2使用WCF創(chuàng)建Web服務

WCF是在VisualStudio中新的服務的開發(fā)平臺。它提出了一種新的接口中定義的端點,其中包括地址,綁定和契約。

地址(Addressing):定義服務的網絡地址,例如,http://www.webservicex.Net/uszip.svc或http://localhost:49187/Service.svc。

綁定(Binding):定義連接客戶端和服務端之間,或兩個服務之間的端點之間的通道。

契約(Contract):有不同類型的契約,服務契約定義了一個接口。該接口將被實現為一個類。操作契約定義了一個接口或端點。該端點將被實現為類的一個方法。數據契約定義將傳入和傳出服務操作的數據類型,這是傳入的參數和返回值的方法的簽名。

為了讓我們把重點放在創(chuàng)建服務和托管服務的過程中,我們在此使用一個簡單的猜數服務為例子。該服務定義了兩個操作:返回所給區(qū)間中的一個隨機暗碼值和返回驗證用戶猜測的結果值。客戶端將創(chuàng)建一個服務的代理和使用代理訪問服務的操作。下面是創(chuàng)建該服務和調用該服務的客戶程序。

第1步:新建一個WCFWeb站點項目

通過選擇文件→新建Web站點→WCF服務,新建一個Web站點項目。為了更好地仿照這個例子,我們使用默認的存儲位置,但是要改變WCFService存儲路徑末尾的文件夾名稱。

項目的解決方案同時被創(chuàng)建。在項目下面,你將看到兩個C#文件:IService.cs和Service.cs。打開這兩個文件中的一個,你可以看到一個代碼模板。

第2步:添加System.ServiceModel名字空間

我們需要名字空間System.ServiceModel中的一組庫函數。此名字空間在VisualStudio2008默認條件下不被自動加載。我們在這一步添加此名字空間。

在解決方案資源管理器中,右鍵單擊項目文件夾下的引用文件夾并選擇“添加引用”,在添加引用對話框中選擇.Net標簽,然后向下滾動直到看到System.ServiceModel。選中它,并點擊確定。

如果使用VisualStudio2010,這一步可省去。

第3步:定義服務契約

打開IService.cs文件,用下面的代碼替換模板中給定的代碼。

[ServiceContract]

publicinterfaceIService{

[OperationContract]

intsecretNumber(intlower,intupper);

[OperationContract]

stringcheckNumber(intuserNum,intsecretNum);

//TODO:AddyourserviceoperationshereorinService.csfile

}

從代碼中可以看到,我們定義了兩個簡單操作的接口:返回所給區(qū)間的暗碼值和返回驗證結果值。

第4步:服務契約的實現

現在,我們將實現上一步中定義的接口。打開Service.cs文件,用下面的代碼替換模板中的代碼。該程序使用隨機數來產生暗碼值。

publicclassService:IService{

publicintsecretNumber(intlower,intupper){

DateTimecurrentDate=DateTime.Now;

intseed=(int)currentDate.Ticks;

Randomrandom=newRandom(seed);

intsNumber=random.Next(lower,upper);

returnsNumber;

}

publicstringcheckNumber(intuserNum,intsecretNum){

if(userNum==secretNum)

return"correct,congratulation!";

else

if(userNum>secretNum)

return"toobig";

elsereturn"toosmall";

}

}

第5步:構建并在瀏覽器中查看編譯后的服務

構建(build)之后,右鍵單擊Service.svc文件并選擇“在瀏覽器中查看”,將生成一個服務網頁,如圖3.3所示。注意,ASP.Net服務的擴展名為.asmx,而WCF服務的擴展名為.svc。與ASP.Net服務不同,這里不生成測試頁。我們必須編寫一個客戶端應用程序來測試這個服務。該服務已經發(fā)布到以下地址:

/WSRepository/Services/NumberGuess/Service.svc

圖3.3生成的服務網頁

點擊本地服務鏈接http://localhost:55143/NumberGuess/Service.svc?wsdl,或發(fā)布的服務鏈/WSRepository/Services/NumberGuess/Service.svc?wsdl我們將看到此服務的WSDL文件。ASP.Net服務和WCF服務使用相同的WSDL服務接口標準。

但是WCF服務的WSDL文件比ASP.Net服務的WSDL文件包含的信息更多。正如前面章節(jié)中討論的,在客戶端應用程序使用ASP.Net服務,選擇添加Web引用(AddWebReference)。如果使用WCF服務,選擇添加服務引用(AddServiceReference)。我們將用下面的例子來討論如何使用WCF服務。

第6步:用客戶端應用程序測試WCF服務

這里,我們將用一個圖形界面來實現一個猜數游戲的客戶端Web應用程序。該程序將使用已經開發(fā)好的猜數字服務來完成其功能。Web應用程序的界面如下圖所示。游戲用戶可輸入暗碼值的區(qū)間。然后,輸入和提交猜數。如圖3.4所示。

圖3.4猜數游戲的界面

我們將使用Windows格式應用(WindowsFormsApplication)模板來實現這個界面。

我們可以在同一解決方案中加新項目:右鍵單擊當前資源管理器中的解決方案,選擇“添加”,然后選“新建項目”。如下圖所示,在添加新項目對話框中,選擇C#。選擇我們將使用Web格式應用(WebForms)模板。生成的解決方案資源管理器中的Default.aspx文件將用來設計用戶界面。Default.aspx.cs文件將包含執(zhí)行用戶界面功能的C#代碼。如圖3.5所示。

圖3.5添加新項目的界面

另一種方法是,重新建立一個解決方案:通過選擇文件→新建項目→ANP.NetWeb應用,如圖3.6所示。

圖3.6重新建立解決方案的界面

項目建好后,我們需要添加把猜數服務添加進來。右鍵單擊NumberGuessClient項目,選擇“添加服務引用”,注意添加WCF服務使用“添加服務引用”,而添加ASP.Net服務則使用“添加Web引用”。從下圖中我們可以發(fā)現WCF服務的地址是:/WSRepository/Services/NumberGuess/Service.svc。我們也可以用本地服務地址http://localhost:55143/NumberGuess/Service.svc。

圖中顯示了添加服務引用的對話框窗口和服務的操作。我們把服務的代理命名為ProxyToGuessService。3.2.3測試Web服務

一旦在C#程序模板中添加了所有服務方法,就可以在.Net菜單中選擇build(編譯),然后用開始(不調試)菜單執(zhí)行程序。

當程序執(zhí)行時,它會立即啟動.Net開發(fā)服務器的Web服務。一個封裝你的服務并用于測試的網頁將被創(chuàng)建,如圖3.7所示。

圖3.7在.Net開發(fā)服務器中啟動Web服務

點擊一個服務,服務后的函數將被遠程調用。例如,如果點擊abs,就要求在輸入面板中輸入一個值作為參數,如圖3.8左部分所示。例如輸入值-1802,輸入之后點擊右下方的“Invoke”,Web服務abs將被遠程調用。返回值將顯示在另外的一個網頁上,如圖3.8右部分所示,返回值1802被封裝在XML文本中。

雖然Web服務的返回值是可讀的,但它的目的是讓其他應用程序讀取,而這個應用程序以更人性化的界面顯示不同的值。圖3.7中的Web頁是測試模式。一旦服務部署在服務器上,Web服務只能通過它們的編程接口訪問。圖3.8從Web瀏覽器中輸入參數值3.2.4作為服務提供商托管Web服務

有三種不同的方式托管服務,并允許遠程訪問Windows環(huán)境下創(chuàng)建的服務:.Net開發(fā)服務器、Windows下的IIS和Web服務器。

1..Net開發(fā)服務器

.Net包括一個開發(fā)服務器,它允許在同一臺計算機上測試并訪問Web服務,而無需連接互聯網或者安裝IIS。事實上,上一節(jié)所討論的例子就是運行在.Net開發(fā)服務器上的。如果把圖3.2所示的Web地址(http://localhost:51783/myService/Service.asmx)復制到運行在同一臺計算機上的應用程序中,則可以在應用中訪問服務。3.4節(jié)將討論在應用程序中訪問Web服務。

2.Windows下的IIS

IIS可以將計算機上的任何一個文件夾(目錄)作為服務器。除了文件夾“C:\inetpub\wwwroot\”外,可以在IIS中創(chuàng)建虛擬目錄(別名)并將其鏈接到文件系統(tǒng)中的任何一個物理目錄上。一旦服務在wwwroot目錄下或在IIS虛擬目錄下,就可以用你的計算機IP地址取代IIS服務器創(chuàng)建的Web地址的“l(fā)ocalhost”部分,從而獲得服務的完整的Web地址。例如,如果你的計算機的IP地址是“07”,則服務的完整的Web地址就是:07/myService/Service.asmx。

3.Web服務器或Windows服務器

如果正在服務器(例如WindowsServer2008)上開發(fā)Web或Windows服務,當按照3.2.3節(jié)所述步驟測試服務時,圖3.7所示的窗口中將會創(chuàng)建完整的Web地址。

在大多數Web服務器上,IIS是一個服務運行環(huán)境。它可以安裝在Windows操作系統(tǒng)中,使得部分文件系統(tǒng)成為服務器。IIS一直在運行,監(jiān)聽請求并處理請求排隊。當遠程客戶激活服務器上的服務時,IIS把遠程客戶端的請求重定向到它托管下的正確服務上。IIS管理服務之間的共享資源。IIS使用安全套接字(SSL)驗證遠程調用者并保障服務器上數據的安全。

如果使用WindowsXP,IIS是可選的,需要插入XP光盤,并選擇添加可選組件添加IIS。如果使用更高版本的Windows(Vista和7),IIS已安裝,但還是需要按照以下步驟打開它:打開“控制面板”,選擇“程序”,然后選擇“程序和特征”,在窗口左側的任務列表中點擊“打開或關閉Windows特征”,然后就可以使用Web管理工具了。

當安裝或打開IIS之后,會看到目錄C:\inetpub\wwwroot\。要測試IIS是否正常工作,可以復制文件夾“myService”到C:\inetpub\wwwroot\],然后復制http://localhost/myService/Service.asmx到Web瀏覽器訪問服務。注意.Net開發(fā)服務器的地址和IIS之間的區(qū)別:IIS的地址不包含“l(fā)ocalhost”后面的數字。

下一步,我們將研究如何創(chuàng)建一個虛擬目錄,使選擇的物理目錄成為一個Web服務器。

為了更好地組織文件和程序,不能把所有的服務都部署到C:\inetpub\wwwroot\。相反,如果使用WindowsXP,則可以按照以下步驟創(chuàng)建IIS虛擬目錄:

(1)定位/決定服務(由VisualStudio創(chuàng)建)放在什么地方。假設包含服務的物理目錄是C:\myService。

(2)使用控制面板中的IIS配置管理器創(chuàng)建一個命名的虛擬目錄(別名)。例如,使用下面的步驟將“myIisService”鏈接到“myService”:①打開你計算機上的“控制面板”。

②打開“系統(tǒng)管理工具“。

③打開Internet信息服務。

④鼠標右鍵點擊“缺省Web站點”,選擇“新建”,然后選擇“虛擬目錄…”。

⑤輸入虛擬目錄的名稱,將其命名為myIisServce。

⑥指定虛擬目錄鏈接到的物理目錄。你可以通過瀏覽選擇目錄C:\myService。

⑦在完成上述步驟后,會看到IIS的默認Web站點myIisService。右鍵單擊myIis

Service

,并選擇“轉換到應用”。此步驟將服務注冊到IISWeb管理服務(WAS),它列出IIS服務目錄下的服務。⑧為Web站點客戶選擇權限,至少應設置讀的權限。為了使網頁中嵌入的腳本可運行,就要允許客戶在你的站點運行腳本,穩(wěn)定性問題將在以后的章節(jié)中討論。

(3)現在,目錄C:\myService中的所有信息在互聯網上可見。如果你想改變虛擬目錄的設置和屬性,右擊“myIisServce”然后選擇“屬性”。

請注意,如果計算機設置了防火墻,對于外部訪問,管理員須打開防火墻的HTTP端口。

在創(chuàng)建一個虛擬目錄和注冊(轉換為應用程序)之后,就可以通過地址:http://localhost/myIisServce/service.asmx訪問服務。用計算機的IP地址取代“l(fā)ocalhost”,這將允許其他計算機通過互聯網訪問服務??梢园凑障铝胁襟E在已有的虛擬目錄中發(fā)布服務:

①在成功地構建一個Web服務項目后,不要選擇執(zhí)行項目,而是在.Net菜單命令中選擇“發(fā)布Web站點”。

②然后,將打開一個對話窗,選擇計算機上的一個虛擬目錄托管服務,例如,可以選擇你創(chuàng)建的目錄:C:\inetpub\wwwroot\myIisServce。③一旦Web站點發(fā)布,將打開一個地址為http://localhost/myIisServce/Service.asmx的網頁。

④用本地主機的IP地址取代“l(fā)ocalhost”,Web服務就有了URL,例如07/myIisServce/service.asmx將是該服務的URL。

上一節(jié)討論了服務提供者角色,它負責創(chuàng)建和托管服務。本節(jié)討論服務中介角色,它提供服務目錄并存儲服務。有三種服務中介:目錄服務、倉庫服務、特別服務列表,每種都包含服務中介所期望的部分功能,如圖3.9所示。3.3服務中介:服務的發(fā)布和發(fā)現

圖3.9三種不同的服務中介

UDDI和ebXML由OASIS(OrganizationfortheAdvancementofStructured

Information

Standards)定義,這是一個不以營利為目的,致力于電子商務標準的開發(fā)、融合、使用的國際協(xié)會。成員自己制定OASIS技術議程,以明確定義的輕量級的開放過程促進業(yè)界的共識和各方的統(tǒng)一。相比較于其他組織,該協(xié)會不僅制定了很多Web服務標準,而且在安全性標準、電子商務、公共部門的標準化工作以及特定應用市場方面也做了很多工作。它成立于1993年,OASIS擁有來自600多個組織的3500多名會員,以及100多個國家的個人會員。

3.3.1具有全部所需特征的服務中介

為了更好地支持SOA軟件的開發(fā),本節(jié)討論服務中介應具備的特征。

服務注冊:這是服務中介的基本功能,它允許服務提供者注冊他們服務的類型、描述、聯系信息、訪問點(如URL),并允許服務請求者基于他們擁有的部分信息發(fā)現想要的服務。

服務存儲:托管服務的執(zhí)行。為了支持大批量訪問,托管服務器必須具有超級計算能力和高速的互聯網連接。

服務規(guī)范和需求:如果某個服務請求者不能發(fā)現服務,可以發(fā)布規(guī)范或需求,從而使服務提供者可以開發(fā)以滿足規(guī)范或需求的服務。服務需求使用自然語言書寫,而服務規(guī)范用規(guī)格語言或接口定義語言如WSDL編寫。

應用模板:不僅是服務,由多個服務和圖形用戶界面(GUI)組成的應用也可以使用SOC范型。應用模板指定了應用的工作流、參與服務的描述、服務接受的標準以及應用集成標準。應用構建者采用應用模板開發(fā)應用。

GUI模板:GUI是一個軟件產品成功的關鍵。GUI模板的發(fā)布可以幫助應用構建者通過使用現有的GUI設計創(chuàng)建用戶友好的高效率的GUI。

合作協(xié)議和模板:合作協(xié)議和模板定義了應該用什么語言定義合作以及服務之間如何通信。合作協(xié)議和模板的發(fā)布規(guī)范了服務提供者如何定義應用、GUI模板和服務接口。因為合作協(xié)議和模板提供了可重用的合作模式,這種模式可在應用和服務開發(fā)中采用,因而縮短了開發(fā)周期。

策略:基于策略的計算建議把數據和計算分離。用來反映策略變化的數據項存儲在配置文件或策略數據庫中。策略的修改可以在運行時完成,無需中斷程序的執(zhí)行。為了重用,可以發(fā)布策略。另一方面,為了滿足對服務中介的動態(tài)需求,服務中介應該用基于策略的計算實現。

數據庫和本體論:服務中介是一個為它的客戶提供各種不同服務的服務。為了存儲和管理大量數據和服務,數據庫的支持是必不可少的。然而,傳統(tǒng)的數據庫并不足以支持服務中介,因為服務中介不僅需要檢索數據,還要發(fā)現服務和應用模板。自動發(fā)現服務和應用模板是服務中介的需求。具有語義屬性和推理能力的本體可以擴展傳統(tǒng)數據庫的能力,更好地支持自動化的服務發(fā)現。

集成測試和評估工具:測試和評估,包括測試用例生成、測試結果(給定輸入的正確輸出)、驗證、確認、可靠性評估和安全性評估,都是軟件開發(fā)中的關鍵而又困難的步驟。服務中介可以提供工具,在綁定服務到應用之前,幫助應用構建者測試服務。

服務質量:服務中介可以跟蹤并保存服務的性能和可信性數據是一項期望的功能,這些數據包括響應時間、吞吐量、可靠性、外部安全性以及成本效益。

理想情況下,用SOA實現服務中介,從而可以使服務中介動態(tài)擴展和重新組合。圖3.10是一個通用的服務中介的例子,它不僅允許規(guī)范、策略、服務和數據的發(fā)布,也允許中介的模型和工具的發(fā)布,例如可靠性評估工具、測試用例生成工具、排名工具。這樣,可以評估中介系統(tǒng)使用的工具,并且如果有更好的工具還可以淘汰已有工具。

圖3.10一個可擴展和再組合的服務中介

基于服務中介的特征,一個典型的SOA軟件開發(fā)過程如圖3.11所示。服務提供者可以通過服務中介了解需要哪些應用、GUI和服務,并就此開發(fā)和發(fā)布應用模板、GUI和服務以滿足需求。服務提供者可以使用服務中介的測試工具測試服務,選擇在服務中介或自己的服務器上托管服務。服務請求者或應用構建者可以簡單地發(fā)布他們的需求,查詢服務中介找到某些模板作為開發(fā)他們的需求、應用模板和GUI的基礎。一旦完成了應用和GUI模板,他們開始查詢所需的服務,填充模板中所需的組件。

圖3.11圍繞服務中介的軟件開發(fā)過程

應用構建者(服務請求者)通過服務中介發(fā)現感興趣的服務。一旦發(fā)現服務的API(應用編程接口),他們遠程調用這些服務。圖3.12是一個典型的服務請求者搜索服務的過程。功能需求封裝到SOAP包中,進一步封裝到HTTP包,然后發(fā)送給服務中介。服務中介拆封HTTP和SOAP包以獲取功能需求。通常情況下,它通過具有語義屬性的本體把需求和滿足需求的最適合的服務相匹配。服務中介把服務的API返回給服務請求者。

圖3.12服務請求者搜索服務的過程3.3.2UDDI服務注冊

統(tǒng)一描述、發(fā)現和集成協(xié)議(UDDI,TheUniversalDescription,Discovery,and

Integration

)是OASIS提出的標準,用于表示、模型化、發(fā)布Web服務(http://www.

)。UDDI最初由IBM、Ariba和Microsoft提出?,F在,已有300家公司參與,包括HP、Intel、Novell和SAP公司。UDDI基于已有的標準,包括XML、SOAP和WSDL。UDDI的主要功能是服務注冊,它的注冊信息大致分為三部分:

①白頁包括服務提供者的姓名、身份(例如,DUNS號)和聯系信息。②黃頁包括企業(yè)類型、產品和服務類型、地理位置。

③綠頁包括和服務相關的綁定信息、服務實現的技術參考模型、指向各種文件的指針以及基于URL的發(fā)現機制。程序可以搜索并解釋這些信息。

在數據組織層,UDDI注冊表的數據從概念上被劃分為五個數據模型,也稱為數據結構,每個表示了UDDI的一個實體。每個實體分配一個統(tǒng)一唯一標識符(UUID),通過以下標識符,在UDDI注冊表中總能找到這些實體。

businessEntity

businessService

bindingTemplate

tModel

publisherAssertion

前兩個條目分別是指白頁和黃頁,而第3和第4個條目與綠頁有關。然而,雖然電話號碼簿和UDDI條目在概念層類似,但在技術層,它們有很大區(qū)別。

我們給出每個數據結構的成員以及它的XMLSchema定義。XMLSchema(XMLS)是用來定義其他語言的語法和數據結構的語言。雖然XMLS將在下一章正式討論,這里給出的這些定義還是很容易理解的。

1.businessEntity

這個數據結構包含公司自身(服務提供者)的信息,包括下列信息項:

公司的統(tǒng)一唯一標識符(可以有多個)(UUID),當公司在UDDI注冊時,分配這一標識。

公司Web地址。

聯系信息。

產業(yè)類別。

提供的服務列表。

businessEntity的XMLS定義如下:

<elementname="businessEntity"type="uddi:businessEntity"/>

<complexTypename="businessEntity">

<attributename="businessKey"type="uddi:businessKey"use="required"/>

<attributename="operator"type="string"use="optional"/><attributename="authorizedName"type="string"use="optional"/>

<sequence>

<elementref="uddi:discoveryURLs"minOccurs="0"/>

<elementref="uddi:name"maxOccurs="unbounded"/>

<elementref="uddi:description"minOccurs="0"maxOccurs="unbounded"/>

<elementref="uddi:contacts"minOccurs="0"/>

<elementref="uddi:businessServices"minOccurs="0"/><elementref="uddi:identifierBag"minOccurs="0"/>

<elementref="uddi:categoryBag"minOccurs="0"/>

</sequence>

</complexType>

在上面定義的基礎上,給出一個數據項實例,定義如下:

<businessEntity

businessKey="uuid:B1D2A3B4-E445-4F32-75BA-67D123451C39"operator="/~ychen10/teaching/cse445/"

authorizedName=―CourseInstructor">

<name>ASUCSE445-598</name>

<description>WeprovidesampleservicesforSOCeducation</description>

<contacts>

<contactuseType="generalinformation">

<description>Email</description><personName>CourseInstructor</personName>

<phone>(480)9652769</phone>

<email>cse445598instructor@</email>

</contact>

<contactuseType="assignmentsandprojects">

<description>Email</description>

<personName>TeachingAssistant</personName>

<email>cse445598TA@</email>

</contact>

</contacts><businessServices>

SOCEducation,SOCsoftwaredevelopment,andSOCresearch

</businessServices>

<identifierBag>

<keyedReferencetModelKey=―uddi:02016094-9c03-47e9-a52b-1dec2d0c1454"name="D-U-N-S"value="913360445"/>

</identifierBag>

<categoryBag><keyedReferencetModelKey="UUID:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2"name="NAICS"value=―246359"/>

</categoryBag>

</businessEntity>

2.businessService

businessService數據模型表示了服務提供者提供和發(fā)布的一個Web服務。統(tǒng)一唯一標識符(UUID)用于該項的businessKey和serviceKey屬性。根據UUID,所有UDDI注冊中心的每個業(yè)務實體和業(yè)務服務是唯一確定的,在信息首次進入時,這個UUID由注冊中心分配。bindingTemplates有一個引用,它保存與指定的業(yè)務服務相關聯的技術服務描述信息。這個數據結構的XMLS定義和例子如下:

<elementname="businessService"type="uddi:businessService"/><complexTypename="businessService">

<attributename="serviceKey"type="uddi:serviceKey"use="required"/>

<attributename="businessKey"

type="uddi:businessKey"use="optional"/>

<sequence>

<elementref="uddi:name"minOccurs="0"maxOccurs="unbounded"/>

<elementref="uddi:description"minOccurs="0"maxOccurs="unbounded"/><elementref="uddi:bindingTemplates"minOccurs="0"/>

<elementref="uddi:categoryBag"minOccurs="0"/>

</sequence>

</complexType>

例子:

<businessServiceserviceKey="uuid:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2businessKey="uuid:01F83FCE-54AC-4C39-B274-C4A390B8EE8C"><name>Array2String</name>

<description>

Convertanarrayoffloatsintoastring,andastringbackintoanarrayoffloats

</description>

<bindingTemplate>...</bindingTemplate>

<categoryBag>…</categoryBag>

</businessService>

3.bindingTemplate

bindingTemplate是businessService數據結構表示的Web服務的技術描述。同一個Web服務有多個bindingTemplate。每個bindingTemplate表示了Web服務的實際實現。例如,可用不同的語言(Java和C#)實現相同的服務規(guī)范,從而更好地支持使用不同語言的應用。雖然Web服務應該是與語言無關的,但如果Web服務使用了特定語言的數據結構,應用程序的語言就無法理解應用中創(chuàng)建的代理。使用多個bindingTemplate的另一個動機是為了靈活性及可靠性,允許服務能夠綁定到不同的協(xié)議或不同的URL地址。例如,除了SOAP綁定,還可以使用MIME綁定(MIME:MultipurposeInternetMailExtension)。這個數據結構的XMLS定義和例子如下:

<elementname="bindingTemplate"type="uddi:bindingTemplate"/>

<complexTypename="bindingTemplate">

<attributename="serviceKey"type="uddi:serviceKey"use="optional"/>

<attributename="bindingKey"type="uddi:bindingKey"use="required"/>

<sequence><elementref="uddi:description"minOccurs="0"maxOccurs="unbounded"/>

<choice>

<elementref="uddi:accessPoint"/>

<elementref="uddi:hostingRedirector"/>

</choice>

<elementref="uddi:tModelInstanceDetails"/>

</sequence>

</complexType>

例子:

<bindingTemplateserviceKey="uuid:c1acf26d-9672-4404-9d70-39b756e62ab4bindingKey="uuid:67153d5b-3659-afb4-8510-adda2c034649">

<description>SOAPBinding</description>

<accessPointURLType="http">

07/Array2String/service.asmx

</accessPoint>

<tModelInstanceDetails>

<tModelInstanceInfotModelKey="uddi:02016094-9c03-47e9-a52b-1dec2d0c1454"><instanceDetails>

<overviewDoc>

<description>

referencestheWSDLservicedefinition

</description>

<overviewURL>

07/Array2String/service.wsdl

</overviewURL>

</overviewDoc></instanceDetails>

</tModelInstanceInfo>

</tModelInstanceDetails>

</bindingTemplate>

4.tModel

tModel是一種描述類型的技術方式,這里類型是指存儲在UDDI注冊中心的業(yè)務、服務、模板結構等的類型。任何抽象概念都可以在UDDI注冊為tModel。在UDDI注冊的每個業(yè)務根據預先定義的服務類型(tModels)列表劃分它的服務。注冊時,可以選擇屬于現有tModel的類型(因此,必須與現有的規(guī)范一致),或定義一個新的tModel。例如,如果定義了一個新的WSDL接口,在UDDI內就可以定義一個表示該接口的tModel。然后,Web服務通過把tModel和業(yè)務服務的一個bindingTemplate相關聯,實現該接口規(guī)范。tModel的XMLS定義及例子如下:

<elementname="tModel"type="uddi:tModel"/>

<complexTypename="tModel">

<attributename="tModelKey"type="uddi:tModelKey"use="required"/>

<attributename="operator"type="string"use="optional"/>

<attributename="authorizedName"type="string"use="optional"/><sequence>

<elementref="uddi:name"/>

<elementref="uddi:description"minOccurs="0"maxOccurs="unbounded"/>

<elementref="uddi:overviewDoc"minOccurs="0"/>

<elementref="uddi:identifierBag"minOccurs="0"/>

<elementref="uddi:categoryBag"minOccurs="0"/>

</sequence>

</complexType>

例子:

<tModeltModelKey="uddi:02016094-9c03-47e9-a52b-1dec2d0c1454"

operator="/~ychen10/teaching/cse445"

authorizedName="CourseInstructor">

<name>Array2StringPortType</name>

<description>Aninterfaceforgeneralfloatarraytostringconversion

</description>

<overviewDoc>

<overviewURL>

07/Array2String/service.d.wsdl

</overviewURL>

</overviewDoc>

</tModel>

5.publisherAssertion

對于大型公司和企業(yè),單一的業(yè)務條目不足以表示這些公司的業(yè)務。UDDI允許發(fā)布多個業(yè)務條目,代表部門或子公司。數據模型publisherAssertion使它們的關系在UDDI注冊中心可見。為了避免某一發(fā)布者錯誤地聲明了與另一發(fā)布者的關系,只有兩個發(fā)布者發(fā)布同樣的信息時,他們的關系才發(fā)布。

publisherAssertion結構包括三個元素:fromKey(thefirstbusinessKey),toKey(thesecondbusinessKey),keyedReference,它用tModel內唯一被tModelKey引用的一對術語(keyName,keyValue),指出了宣稱的關系的類型。這個數據結構的XMLS定義如下:

<elementname="publisherAssertion"type="uddi:publisherAssertion"/>

<complexTypename="publisherAssertion">

<sequence><elementref="uddi:fromKey"/>

<elementref="uddi:toKey"/>

<elementref="uddi:keyedReference"/>

</sequence>

</complexType>

服務提供者和應用構建者提供的UDDIAPIs可以創(chuàng)建和訪問UDDI數據條目。下面的API操作支持這一目標。

InquiryOperations:Find

find_business

find_service

find_binding

find_tModel

Getdetails

get_businessDetail

get_serviceDetail

get_bindingDetail

get_tModelDetail

get_registeredInfoPublishingOperations:

Save

save_business

save_service

save_binding

save_tModel

Delete

delete_business

delete_service

delete_bindingdelete_tModel

get_registeredInfo

Securityoperations:

get_authToken

discard_authToken

以find_business作為例子,它搜索和給定標準匹配的業(yè)務。這個API的語法定義如下:

<find_businessgeneric="2.0"[maxRows="nn"]xmlns="urn:uddi-org:api_v2">

[<findQualifiers/>]

[<name/>[<name/>]...]

[<discoveryURLs/>]

[<identifierBag/>]

[<categoryBag/>]

[<tModelBag/>]

</find_business>該API的參數解釋如下:

·maxRows:可選參數,指定返回的最大行數。

·findQualifiers:可選參數,重載默認搜索功能。例如,查找與企業(yè)名稱完全相符的方法exactNameMatch。

·name:業(yè)務的全部或部分名稱。UDDI2.0最多可以指定五個業(yè)務名稱。

·discoveryURLs:可選參數,按發(fā)現的URLs進行搜索。

·identifierBag:可選參數,按標識符搜索。

·categoryBag:可選參數,按類搜索。例如,可以按NAICS代碼進行搜索。

·tModelBag:可選參數,按tModel記錄搜索。

目前,大型計算機公司,例如IBM,Microsoft和SAP,都有公共的可訪問的UDDI服務,并提供UDDI服務軟件,允許用戶實現自己的UDDI服務并供企業(yè)內部或外部使用。UDDI是Windowsserver2003的一個標準組件。它的標準安裝會安裝微軟的企業(yè)UDDI組件,這個組件允許服務提供者注冊,也允許提供者開發(fā)的服務注冊(更多的信息可以查看網址:/)。IBM的WebSphereSOA開發(fā)環(huán)境可以安裝UDDI組件,該組件提供注冊服務。圖3.13顯示了微軟企業(yè)UDDI組件的體系結構。它為手動注冊、自動注冊和注冊表搜索提供了人機接口和編程接口。

圖3.13Microsoft的UDDI服務器的體系結構

UDDI請求管理器接收來自ASP.Net頁面或Web服務接口的請求,并調用UDDI類庫中合適的服務。

UDDI類庫把不同類型的函數封裝成標準的Web服務,包括MSDE和SQL數據庫提供的服務。

作為普通用戶,可以手工注冊為服務提供者、然后注冊服務并搜索服務。

作為編程用戶,可以通過.Net編程環(huán)境下的C#訪問企業(yè)UDDI服務。在C#程序開頭,你可以導入內嵌的UDDI名字空間/庫,它提供了訪問UDDI服務必需的類和函數:usingMicrosoft.Uddi;

usingMicrosoft.Uddi.Services;

usingMicrosoft.Uddi.TModels;

然后,你可以使用下面的類和類的成員函數訪問服務:UddiConnectionconn=

newUddiConnection("http://localhost/uddi/inquire.asmx");//1stFindServicefs=newFindService(txtName.Text);//2nd

ServiceListservList=fs.Send(conn);//3rdforeach(ServiceInfoservInfoinservList.ServiceInfos){//4th

MessageBox.Show("Service:"+servInfo.Names[0].Text

+""+servInfo.ServiceKey);

}

第一條語句創(chuàng)建了一個UddiConnection實例,用企業(yè)UDDI服務地址作為構造函數的參數。此語句建立了與被訪問的UDDI的連接。

第二條語句創(chuàng)建了類“FindService”的一個對象,以便找到所需的業(yè)務。通過文本文件“txtName.Text”,搜索鍵被傳給對象。第三條語句調用對象FindService的Send方法(成員函數),以前創(chuàng)建的UddiConnection對象作為參數傳遞。Send方法返回一個ServiceList類型的可用服務列表。

第四條語句是一個for循環(huán),在循環(huán)中顯示找到的每個服務的服務名稱和標識。

UDDI實體的訪問在概念和語法上類似于數據庫操作。本書第7章將詳細討論程序和數據庫之間的接口以及數據庫訪問和操作的接口。3.3.3ebXML服務注冊和存放

用于電子商務的可擴展標記語言(ebXML,ElectronicBusinessusingeXtensibleMarkupLanguage)是一種規(guī)格說明/標準的模塊化套件,這種規(guī)格說明/標準使任何地方任何規(guī)模的企業(yè)都可以通過互聯網開展業(yè)務。使用ebXML,各公司就有一個標準的方法來交換業(yè)務信息、開展貿易關系、用共同的術語進行數據通信、定義并注冊業(yè)務過程(http:///)。從服務中介的角度來看,它定義了比UDDI更多的功能。最顯著的區(qū)別在于,ebXML除了提供服務注冊外,還提供了服務存儲。由于大型計算機公司,如Microsoft、IBM和Oracle,都有托管自己服務的資源,因此他們更喜歡使用UDDI。另一方面,中小IT企業(yè)、核心業(yè)務不是IT的公司以及政府組織會選擇ebXML。ebXML于1999年由OASIS和聯合國/ECE機構CEFACT共同提出。原項目設想并給出了數據規(guī)格的五個層次,包括XML標準。

1.ebXML業(yè)務過程規(guī)格說明圖表,或ebBPebXMLBusiness(ProcessSpecificationSchema)

ebXML業(yè)務過程規(guī)格說明圖表定義了一個配置合作伙伴之間的業(yè)務協(xié)作執(zhí)行系統(tǒng)的標準語言。業(yè)務流程定義(或ebBP定義),描述了能夠實現合作伙伴企業(yè)目標的、共同使用的一個業(yè)務流程,該流程支持過程設計/描述,能夠協(xié)作監(jiān)控和確認并引導流程的執(zhí)行。ebBP指明了業(yè)務交易(S)、業(yè)務合作(BC)所使用的共同設計語言(choreography),以及合作的業(yè)務。協(xié)作雙方為了調整技術狀態(tài)交換業(yè)務信號。核心功能包括:①標準的和可擴展的業(yè)務交易模式;

②狀態(tài)調整;

③雙方或更多方的業(yè)務合作;

④組合及關系是可見的:不管過程定義在什么地方,在業(yè)務交易中第三方是可見的;

⑤允許混合使用ebXML或Web服務;

⑥支持參與方/角色定義;

⑦改進過程生命周期的組成部分以及各部分間的轉換;

⑧使用語義信息處理過程和文檔。

2.核心組件

ebXML核心組件技術規(guī)格(CCTS)提出了開發(fā)通用業(yè)務數據類型的語義構建塊的方法。這使通過核心組件(CC)和業(yè)務信息實體(BIEs,BusinessInformationEntities),可重用具有共同理解的數據成為可能。CC和BIEs是由聯合國(UN)的促進貿易和電子商務中心(CEFACT)開發(fā)的,CC提供:

①對象/數據的通用概念模型;

②定義詞典條目的通用語義信息時的命名習慣;

③為了業(yè)務價值表示的一致性,一組固定的可重用的數據類型。

3.合作協(xié)議草案和協(xié)議(CPPA)

它為業(yè)務協(xié)作提供了通過技術達到合作伙伴期望的渠道。該草案包含業(yè)務合作伙伴的技術能力。它涵蓋了協(xié)議的特征和屬性提供的功能和偏好,這里協(xié)議的特征和屬性是在過程中使用的活動和組件服務的特定角色所具有的。它使協(xié)作過程中會話的監(jiān)控和交付渠道特征的驗證成為可能。第二組協(xié)議包含了配置業(yè)務合作協(xié)議共享方面的數據。CPP/CPA2.1增進的功能包括:

①其他信息、業(yè)務過程、功能(如ebBP)的擴展框架;

②擴展了消息交換模式的傳輸能力;③增加了多個公開服務的組合性;

④改進了合作方的身份鑒定。

4.消息服務

消息服務定義了交換電子商務信息時通信協(xié)議中立的方法。它定義了信息功能、協(xié)議、在SOAP上運行時(SOAPv1.1和帶附件的SOAP)的封裝、綁定到依賴標準SOAP綁定的較低傳輸層;當需要時可用ebMS補充上述信息。

5.注冊和存儲

ebXML3.0的注冊和存儲中心提供了注冊、定位以及訪問分布式(或聯合)安全環(huán)境中的信息資源的服務。目前3.0的特征包括:

①注冊聯合支持;

②復制內容/元數據;

③增強安全性:XACML,SAML;

④可擴展的服務接口和協(xié)議;

⑤新的服務請求和響應類型的定義;

⑥HTTP綁定到ebXML注冊服務接口;

⑦使用REST類型的體系結構;⑧內容管理(確認和目錄管理);

⑨增強查詢。

ebXML的目標是為中小型企業(yè)(SME)和政府機構的綜合電子商務平臺提供技術路徑。電子商務交易

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論