本章提要說明_第1頁
本章提要說明_第2頁
本章提要說明_第3頁
本章提要說明_第4頁
本章提要說明_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

字典類字典類 序列化類型映 反序列化類型映 對(duì)象類 本章提 通過獨(dú)立服務(wù)器方式發(fā)布服 發(fā)布實(shí)例方 Methods屬 AddMethod方 25AddMethods方 AddMissingMethod方 隱藏發(fā)布列 調(diào)試開 對(duì)象序列化模 P3P開 跨域開 服務(wù)器事 OnSendHeader事 OnSendError事 存取環(huán)境上下 通過aspx方式發(fā)布服 按全局發(fā)布方 按會(huì)話發(fā)布方 按請(qǐng)求發(fā)布方 存取環(huán)境上下 通過自定義HTTP處理程序來發(fā)布服 本章提 同步調(diào) 帶名稱空間(別名前綴)方 可變的參數(shù)和結(jié)果類 引用參數(shù)傳 自定義類型的傳 通過代理接口進(jìn)行同步調(diào) 接口定 帶名稱空間(別名前綴)方 可變的參數(shù)和結(jié)果類可變的參數(shù)和結(jié)果類 泛型參數(shù)和引用參數(shù)傳 自定義類 異步調(diào) 通過代理接口進(jìn)行異步調(diào) 異常處 同步調(diào)用異常處 異步調(diào)用異常處 超時(shí)設(shè) HTTP參數(shù)設(shè) 代理服務(wù) 持久連 HTTP標(biāo) 前本章提要前本章提要?dú)g迎使用您還在為歡迎使用您還在為Ajax您還在為WebService的低效而苦惱嗎?您還在為選擇C/SB/S而猶豫不決嗎?HproseHighPerformanceRemoteObjectServiceEngine)是一個(gè)商業(yè)開源的新型輕量級(jí)跨語言跨平hjHprose使您能高效便捷的創(chuàng)建出功能強(qiáng)大的跨語言,跨平臺(tái),分布式的電信級(jí)應(yīng)用系統(tǒng)。如果您剛接觸網(wǎng)絡(luò)編程,您會(huì)發(fā)現(xiàn)用Hprose來實(shí)現(xiàn)分布式系統(tǒng)易學(xué)易用。如果您是一位有經(jīng)驗(yàn)的程序員,您會(huì)發(fā)現(xiàn)它Hprose是PHPRPCPHPRPC的各種優(yōu)點(diǎn)之外,它還具有更多特色功能。Hprose使用更好的方式來表示數(shù)據(jù),在更加節(jié)省空間的同時(shí),可以表示更多的數(shù)據(jù)類型,解析效率也更加高效。在數(shù)據(jù)傳輸上,Hprose以更直接的方式來傳輸數(shù)據(jù),不再需要二次編碼,可以直接進(jìn)行流式讀寫,效率更高。在遠(yuǎn)程調(diào)用過程中,數(shù)據(jù)直接被還原為目標(biāo)類型,不再需要類型轉(zhuǎn)換,效率上再次得到提高。后即可獲得源代碼的閱讀或修改權(quán),這樣您就可以在遇到問題時(shí)更快的找到問題并修復(fù)它,或者在您無法直接修復(fù)的情況下,更準(zhǔn)確的將錯(cuò)誤描述給我們,由我們來幫您更快的解決它。您還可以將您所修改的更加完美的代碼或者由您所增加的某個(gè)激動(dòng)人心的功能反饋給我們,讓我們能夠更好的來一起完善它。正是因?yàn)橛羞@種機(jī)制的存在,您在使用該產(chǎn)品時(shí),實(shí)際上可能遇到的問題會(huì)更少,因?yàn)閱栴}可能已經(jīng)被他人修跨語言的能力上較其它開源產(chǎn)品有著明顯的不可取代的綜合優(yōu)勢(shì),Hprose還可以保證所有語言的實(shí)現(xiàn)具有完善的商業(yè)支持,可以在任何時(shí)候?yàn)槟峁┧璧膸椭?。不?huì)向其它沒有商業(yè)支持的開源軟件那樣,當(dāng)您HproseHprose支本手冊(cè)中有些內(nèi)容可能在其它語言版本的手冊(cè)中也會(huì)看到,我們之所以會(huì)在不同語言的手冊(cè)中重復(fù)這接下來我們就可以開始Hprose2體菜單描述屏幕截圖代碼范例運(yùn)行結(jié)果獲取幫助體菜單描述屏幕截圖代碼范例運(yùn)行結(jié)果獲取幫助電子文檔/documents.phpHprose這些文檔都是PDF在線支持升每1-3Hprose3HellopublicclassHellopublicstaticvoidmain(String[]{System.out.println("Hello}}聯(lián)系我們報(bào)告漏洞與需求反饋系統(tǒng)進(jìn)行反饋。我們的反饋系統(tǒng)專門用于收集所有有用的信息,它能幫助我們捕獲缺陷和了解用戶對(duì)聯(lián)系我們報(bào)告漏洞與需求反饋系統(tǒng)進(jìn)行反饋。我們的反饋系統(tǒng)專門用于收集所有有用的信息,它能幫助我們捕獲缺陷和了解用戶對(duì)4濰坊市高新區(qū)玉清東街以北中心次干道以西高新大廈(市場(chǎng)及大型項(xiàng)目合作:產(chǎn)品購買及項(xiàng)目定制:技術(shù)支持:第一章快速入門HproseforC#本章提第一章快速入門HproseforC#本章提要Hprosefor客戶端Hprosefor客戶端.NETFramework版本(1.0,1.1,2.0,3.0,3.5,4.0)全部支持。所有.NETFrameworkClientProfile版本(3.5,4.0)全部支持。.NETCompactFramework版本(1.0,2.0,3.5)SilverLight2.0,3.0,4.0WindowsAzurePlatform。支持Mono。服務(wù)器.NETFramework版本(1.0,1.1,2.0,3.0,3.5,4.0)全部支持。支持微軟最新的云計(jì)算平臺(tái)WindowsAzurePlatform。支持Mono安裝方法二進(jìn)制方式HproseforC#提供了可以直接使用的二進(jìn)制文件,針對(duì)不同版本的.NET.NETFramework1.0~3.5System.Numerics.dll、Hprose.dll這三個(gè)文件。而.NETFramework4.0Hprose.dllHprose.Client.dll其中System.Numerics.dll與.NETFramework4.0System.Numerics.dll基本上完全兼容,它是.NETFramework4.0中該文件在其它版本中的移植。HproseHprose時(shí),該Hprose.dllHproseforC#的完整版本,Hprose.Client.dllHproseforC#的客戶端版本。Hprose.dll才需要選擇Hprose.dll。只有HproseforC#企業(yè)版中才包含Hprose.dll。.NETCompactFrameworkSilverlight版本中只包含有System.Numerics.dll和Hprose.Client.dll這兩源碼方式HproseforC#不是使用VisualStudio開發(fā)的,它針對(duì)的所有.NET版本的源碼只有一套,根據(jù)不同的編make.batC#編譯器來完成編譯。所以,您即使僅僅安裝了.NETFramework運(yùn)行時(shí),也可以通過該批處理程序完成相應(yīng)版本的編譯,因?yàn)镃#編譯器在.NETFramework運(yùn)行時(shí)中已經(jīng)包含,所以您無需安裝.NETFrameworkSDK。6HproseforC#同樣支持HproseforC#同樣支持Mono,但因?yàn)镸ono本身存在很多問題,并不穩(wěn)定,所以Mono中使用HproseforC#可能會(huì)在某些特殊情況下遇到一些奇怪的問題。所以,我們不建議您使用Mono。但如果您一定要堅(jiān)Mono下遇到的任何問題(除非該問題在.NETFramework下也同樣存在HproseHello服務(wù)器VisualC2008ExpressEditionHprose服務(wù)器,HelloWorld為例來作為開始的,我們這里稍稍做一下改變,我們創(chuàng)建的服務(wù)器將發(fā)布一個(gè)sayHello方法,這樣客戶端就可以調(diào)用它來對(duì)任何事物說Hello啦。項(xiàng)目引用中,除了System78usingusingnamespace{classHellopublicstringsayHello(string{return"Hello"+name+}}classProgramstaticvoidMain(string[]args)HproseHttpListenerServerserver=newHproseHttpListenerServer("http://localhost:2010/");server.Methods.AddInstanceMethods(newHello());Console.WriteLine("Serverstarted.");Console.WriteLine("Serverstoped.");}}}9HproseHello客戶端客戶端我們以C#控制臺(tái)程序?yàn)槔?,開發(fā)環(huán)境仍然為HproseHello客戶端客戶端我們以C#控制臺(tái)程序?yàn)槔_發(fā)環(huán)境仍然為VisualC#2008ExpressEdition客戶端可以通過Invoke方法動(dòng)態(tài)調(diào)用服務(wù),也可以通過接口方式來調(diào)用,下面我們來分別介紹這兩種通過Invoke方法動(dòng)態(tài)調(diào)用Invoke加Hprose.Client.dll和System.Numerics.dll這兩個(gè)引用:接下來開始編寫HelloClientInvoke中所指定的類型為返回結(jié)果的類型。第三句是通過非泛型方法調(diào)用,結(jié)果并不stringobject類型返回。但是因?yàn)镃onsole.WriteLineobject輸出,所以這里我們usingusingnamespace{classProgramstaticvoidMain(string[]args)HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");Console.WriteLine(client.Invoke<string>("sayHello",newobject[]{"World"}));Console.WriteLine(client.Invoke("sayHello",newobject[]{"Hprose"}));}}}通過Invoke方法調(diào)用服務(wù)器方法很靈活,Invoke方法具有多個(gè)重載,即使是對(duì)同一個(gè)服務(wù)器方法,您通過Invoke方法調(diào)用服務(wù)器方法很靈活,Invoke方法具有多個(gè)重載,即使是對(duì)同一個(gè)服務(wù)器方法,您Invoke調(diào)用不是那么的直觀,參數(shù)需要自己寫入數(shù)組,結(jié)果也需要自己轉(zhuǎn)型,通過接口方式調(diào)用usingusingnamespaceHelloExampublicinterfaceIHellostringsayHello(string}如果您曾經(jīng)用過WCF、.NETRemoting或者其它的遠(yuǎn)程調(diào)用技術(shù)的話,您可能會(huì)驚訝的發(fā)現(xiàn),Hprose比那些遠(yuǎn)程調(diào)用技術(shù)要方便容易的多。這里的IHello如果您曾經(jīng)用過WCF、.NETRemoting或者其它的遠(yuǎn)程調(diào)用技術(shù)的話,您可能會(huì)驚訝的發(fā)現(xiàn),Hprose比那些遠(yuǎn)程調(diào)用技術(shù)要方便容易的多。這里的IHello接口在服務(wù)器端并沒有實(shí)現(xiàn),只是有相同的方法,但在客戶端仍然可以直接通過接口進(jìn)行調(diào)用。HproseHproseC#HproseforC#中接口并不是用來約束服務(wù)器與客戶端必須有一致方法簽名的手段,而僅僅classProgramstaticvoidMain(string[]args)HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");IHellohello=client.UseService<IHello>();}}}第二章類型映射HproseHprosefor第二章類型映射HproseHproseforC#本章提要基本類型值類型另一個(gè)可能會(huì)引起您注意的是,這里把空和空串也作為值類型對(duì)待了。這里把它列為值類型而不是引是表示在引用類型引用類型在Hprose中有引用計(jì)數(shù),在序列化過程中,當(dāng)遇到相等的引用類型時(shí),后寫入的值是先前寫類描基本類型值類型另一個(gè)可能會(huì)引起您注意的是,這里把空和空串也作為值類型對(duì)待了。這里把它列為值類型而不是引是表示在引用類型引用類型在Hprose中有引用計(jì)數(shù),在序列化過程中,當(dāng)遇到相等的引用類型時(shí),后寫入的值是先前寫類描類描1(NaN空(null基本類型的映射.NETHprose類型的映射關(guān)系不是一一對(duì)應(yīng)的。在序列化過程中可能會(huì)有多種.NET類型對(duì)應(yīng)同一種序列化類型映射反序列化默認(rèn)類型映射Hprose基本類型的映射.NETHprose類型的映射關(guān)系不是一一對(duì)應(yīng)的。在序列化過程中可能會(huì)有多種.NET類型對(duì)應(yīng)同一種序列化類型映射反序列化默認(rèn)類型映射Hprose.NET.NETHprose空反序列化有效類型映射有效類型是指在對(duì)Hprose數(shù)據(jù)反序列化時(shí),可以指定的反序列化結(jié)果類型。當(dāng)指定的類型為安全類型時(shí),反序列化總是可以得到結(jié)果。當(dāng)指定的類型為非安全類型時(shí),只有當(dāng)數(shù)據(jù)符合一定條件時(shí),反序列化Hprose.NET(安全.NET(非安全無無反序列化有效類型映射有效類型是指在對(duì)Hprose數(shù)據(jù)反序列化時(shí),可以指定的反序列化結(jié)果類型。當(dāng)指定的類型為安全類型時(shí),反序列化總是可以得到結(jié)果。當(dāng)指定的類型為非安全類型時(shí),只有當(dāng)數(shù)據(jù)符合一定條件時(shí),反序列化Hprose.NET(安全.NET(非安全無無無Hprose.NET空容器類型列表類型序列化類型映射Hprose反序列容器類型列表類型序列化類型映射Hprose反序列化類型映射Hprose列表類型默認(rèn)映射為.NET的ArrayListHprose.NET(安全.NET(非安全無無空無無無所有實(shí)現(xiàn)了字典類型序列化類型映所有實(shí)現(xiàn)了字典類型序列化類型映射所有實(shí)現(xiàn)了IDictionaryIDictionary<TKey,TValue>接口的類型和匿名類型均映射為Hprose反序列化類型映射什么?HashMap?沒錯(cuò),是HashMap!.NETHashtableDictionarynullnull作為鍵值的。為了提供與其它語言的兼容性,Hprose為.NETHashMap類型,HashMapHashtable的唯一用HashMap類型,使用Hashtable類型就可以接收HashMap的對(duì)象實(shí)例了。Hprose對(duì)象類型Hprose通過 來注冊(cè)自定義類型,但是在Hprose所支持的.NET自定義可序列化對(duì)象類型僅是.NET可序列化類型的一個(gè)子集。Hprose下都需要在定義類時(shí)標(biāo)記[Serializable]屬性。按屬性序列化時(shí),只有g(shù)et和set存取方法都定ClassManager.Register(typeof(My.Package.User),HproseforC#深入的了解HproseHproseforC#深入的了解HproseforC#本章提要通過aspx方式發(fā)布服務(wù)通過自定義HTTP通過獨(dú)立服務(wù)器方式發(fā)布服通過獨(dú)立服務(wù)器方式發(fā)布服務(wù)HproseHprose發(fā)布的服務(wù)在本質(zhì)上就是方法,所以我們先來發(fā)布實(shí)例方法在前面快速入門一章里,您已經(jīng)看過如何發(fā)布一個(gè)類中的實(shí)例方法了。在哪個(gè)例子中我們傳輸?shù)氖呛?jiǎn)上面類中,有publicclass{protectedStringid;publicExam1(){id="Exam1";}publicString{return}publicintSum(int[]{intsum=for(inti=0,n=nums.Length;i<n;{sum+=}return}publicHashtableSwapKeyAndValue(Hashtable{DictionaryEntry[]entrys=newDictionaryEntry[strmap.Count];strmap.CopyTo(entrys,0);foreach(DictionaryEntryentryin{strmap[entry.Value]=}return}}Sum方法的參數(shù)是一個(gè)整型數(shù)組,其結(jié)果是返回?cái)?shù)組中所有整數(shù)的和。不過當(dāng)您在客戶端調(diào)用它時(shí),并不必非要帶入整型數(shù)組類型的參數(shù),也可以是整型元素的列表。但仍然推薦使用類型相同的參數(shù)進(jìn)行調(diào)Sum方法的參數(shù)是一個(gè)整型數(shù)組,其結(jié)果是返回?cái)?shù)組中所有整數(shù)的和。不過當(dāng)您在客戶端調(diào)用它時(shí),并不必非要帶入整型數(shù)組類型的參數(shù),也可以是整型元素的列表。但仍然推薦使用類型相同的參數(shù)進(jìn)行調(diào)不會(huì)拋出錯(cuò)誤,而是會(huì)正確執(zhí)行。這要?dú)w功于Hprose提供的允許null作為鍵的HashMap類。不過為了說明傳輸自定義可序列化類型,我們這里要先看一下在第二個(gè)類中所使用的自定義可序列化類型UserUser類之前,先來說明一下Male、Female、InterSex0,1,2,3。現(xiàn)在您可能已經(jīng)明白這個(gè)順序不是亂寫的了,從位運(yùn)InterSex這個(gè)性別感到驚奇,我們這個(gè)社會(huì)并不是一個(gè)非男即女的二元性別社會(huì),我們不能也InterSex這個(gè)性別是對(duì)這個(gè)群體的尊重。雖然我們這里討論的問題與此無C#中支持對(duì)枚舉進(jìn)行位運(yùn)算,在其它不支持對(duì)枚舉類型進(jìn)行位元算的語言(例如Java)中也可以按照Hprose下面我們來看UserpublicclassUser{privatestringname;privateSexsex;privateDateTimebirthday;privateintage;privateboolmarried;publicUser(){}publicUser(stringname,Sexsex,DateTimebirthday,intage,boolmarried)Unknown|Male=MaleUnknown|Female=FemaleMale|Female=publicenumSexUnknown,Male,Female,}=name;this.sex=sex;this.birthday=birthday;this.age=age;this.married==name;this.sex=sex;this.birthday=birthday;this.age=age;this.married=}publicstring{getreturn}setname=}}publicSex{getreturn}setsex=}}publicDateTime{getreturn}setbirthday=}}publicint{getreturn}setage=}}publicbool{getreturn}setidgetID方法時(shí),將會(huì)返回idgetID方法時(shí),將會(huì)返回"Exam2"getUserList方法很簡(jiǎn)單,就是創(chuàng)建一個(gè)UserList按照快速入門中的經(jīng)驗(yàn),發(fā)布Exam2只需要以下三句就可以了:但是運(yùn)行結(jié)果可能會(huì)出乎您的預(yù)料,當(dāng)您打開瀏覽器瀏覽服務(wù)頁面時(shí),您會(huì)發(fā)現(xiàn)只有GetUserList這一個(gè)方法被發(fā)布了,從Exam1中繼承來的方法都沒有被發(fā)布,這是正確的嗎?Object繼承下來的,如果將繼承來的public方法Object繼承來的方法也一起發(fā)布,這肯定不是用戶所期望的結(jié)果。另一個(gè)原因,用戶定義的類的層次可能比較深,而其定義的基類上的方法可能并不想被一起發(fā)布。因此,默認(rèn)情況下,只發(fā)布直接在該類中聲明的public方法,而不會(huì)發(fā)布繼承來的方法。HproseHttpListenerServerserver=newHproseHttpListenerServer("http://localhost:2010/");server.Methods.AddInstanceMethods(newExam2());publicclassExam2:{publicExam2(){id="Exam2";}publicList<User>{List<User>userlist=newuserlist.Add(newUser("Amy",Sex.Female,newDateTime(1983,12,3),26,userlist.Add(newUser("Bob",Sex.Male,newDateTime(1989,6,12),20,userlist.Add(newUser("Chris",Sex.Unknown,newDateTime(1980,3,8),29,userlist.Add(newUser("Alex",Sex.InterSex,newDateTime(1992,6,14),17,false));returnuserlist;}}}}這里,AddInstanceMethods與Exam2Exam1這里,AddInstanceMethods與Exam2Exam1AddInstanceMethods發(fā)布它就可以了。例如:但實(shí)際上這樣的話,Exam1Exam2HproseHttpListenerServerserver=newHproseHttpListenerServer("http://localhost:2010/");Exam1exam1=newExam1();Exam2exam2=newserver.Methods.AddInstanceMethods(exam1,"ex1");server.Methods.AddInstanceMethods(exam2,typeof(Exam1),"ex2");server.Methods.AddInstanceMethods(exam2,typeof(Exam2),"ex2");HproseHttpListenerServerserver=newHproseHttpListenerServer("http://localhost:2010/");Exam1exam1=newExam1();Exam2exam2=newserver.Methods.AddInstanceMethods(exam2,typeof(Exam1));server.Methods.AddInstanceMethods(exam2,typeof(Exam2));server.Methods.AddInstanceMethods(exam2,HproseHttpListenerServerserver=newHproseHttpListenerServer("http://localhost:2010/");Exam2exam2=newExam2();server.Methods.AddInstanceMethods(exam2,server.Methods.AddInstanceMethods(exam2,typeof(Exam2));Methods屬性MethodsAddInstanceMethods方法來發(fā)布對(duì)象上的實(shí)例方法。其實(shí),你還可以通過它的AddStaticMethods方法來發(fā)布類上的靜態(tài)方法。通過AddMethod和AddMethods方法還可以進(jìn)行更細(xì)粒度的方法發(fā)布控制,通過AddMissingMethodMethods屬性MethodsAddInstanceMethods方法來發(fā)布對(duì)象上的實(shí)例方法。其實(shí),你還可以通過它的AddStaticMethods方法來發(fā)布類上的靜態(tài)方法。通過AddMethod和AddMethods方法還可以進(jìn)行更細(xì)粒度的方法發(fā)布控制,通過AddMissingMethod還可以設(shè)置默認(rèn)處理方法我們下面就來詳細(xì)介紹一下MethodsAddMethod方法public靜態(tài)方法,并且可以為每個(gè)方法都指定別名。當(dāng)您發(fā)布的方法具有相同個(gè)數(shù)參數(shù)的重載時(shí),使用AddMethod是唯一可行的方法。AddMetho 方AddMethods方法通常比直接使用AddMethod方法更為方便。因?yàn)槟坏梢詾槊總€(gè)方它。因?yàn)橛懈雍?jiǎn)單的AddInstanceMethods和AddStaticMethodsAddInstanceMethod方AddInstanceMethods用來發(fā)布指定對(duì)象上的指定類層次上聲明的所有public實(shí)例方法。它有四種重載AddInstanceMethodspublic實(shí)例方法。這個(gè)方法也支持指定名稱空間(別名前綴AddStaticMeth方AddStaticMethodspublicAddMissing方使用AddMissingMethod發(fā)布的方法可以是實(shí)例方法,也可以是靜態(tài)方法,但是只能發(fā)布一個(gè)。如果多次調(diào)用AddMissingMethod方法,將只有最后一次發(fā)布的有效。AddMissingMethod2argsargsargs02argsargsargs0隱藏發(fā)布列表上面例子中,我們發(fā)布服務(wù)之后,可以通過瀏覽器直接查看到所有發(fā)布的方法名稱列表。這個(gè)發(fā)布列WebServiceWSDLWSDL不同的是,Hprose的發(fā)布列表僅包含方法名,而不包含與WebService相比無論是服務(wù)的發(fā)布還是客戶端的調(diào)用上都更加靈活。當(dāng)然您可能出于某些原因,并不希望用戶直接通過瀏覽器就可以查看發(fā)布列表,那么您可以禁止服務(wù)器接收GET請(qǐng)求。方法很簡(jiǎn)單,只需要將服務(wù)器的IsGetEnabled屬性設(shè)置為false即可:調(diào)試開關(guān)對(duì)象序列化模式前面我們發(fā)布的GetUserList方法傳遞的是自定義可序列化對(duì)象列表。在介紹自定義可序列化對(duì)象時(shí)我那么字段模式和屬性模式究竟哪種更好呢?我們推薦您使用屬性模式,因?yàn)閷傩阅J讲坏梢愿玫母渌Z言交互,而且效率上也高于字段模式。但默認(rèn)情況下,Hprose卻是以字段模式進(jìn)行序列化的,這樣做主要是為了與PHPRPC中的設(shè)置相兼容。server.IsDebugEnabled=true;server.IsGetEnabled=false;(Stringname,Object[]P3P開關(guān)Hprosehttp服務(wù)中還有一個(gè)P3P開關(guān),這個(gè)開關(guān)決定是否發(fā)送P3PP3P開關(guān)Hprosehttp服務(wù)中還有一個(gè)P3P開關(guān),這個(gè)開關(guān)決定是否發(fā)送P3P的http頭,這個(gè)頭的作用是IECookieCookie時(shí)(例如通跨域開關(guān)HproseJavaScript、ActionScriptSilverLightJavaScript服務(wù)器提供了兩種跨域方案,一種是W3C即可開啟,當(dāng)你在使用HproseNepenthes(忘憂草)時(shí),一定要注意必須要打開此開關(guān)才能正確進(jìn)行調(diào)試,否則Nepenthes將報(bào)告錯(cuò)誤的服務(wù)器。另一種跨域方案同時(shí)適用于以上三種客戶端,那就是通過設(shè)置跨域策略文件的方式。你可以通過CrossDomainXmlFileCrossDomainXmlContent這兩個(gè)屬性來設(shè)置跨域策略文件。CrossDomainXmlFile的值為跨域策略文件的路徑,你可以設(shè)置絕對(duì)地址,也可以設(shè)置成相對(duì)于當(dāng)前可執(zhí)行文件所在目錄的相當(dāng)?shù)刂?。CrossDomainXmlContent的值為跨域策略文件的內(nèi)容。這兩個(gè)屬性,你不必同時(shí)設(shè)置,只需要設(shè)置其中之一即可。當(dāng)設(shè)置這兩個(gè)屬性的其中一個(gè)時(shí),另一個(gè)屬性值也會(huì)有相應(yīng)的改變,因此如果你同時(shí)設(shè)置最后,HproseSilverLight的跨域方案,那就是通過設(shè)置客戶端訪問策略文件的方ClientAccessPolicyXmlFileClientAccessPolicyXmlContent這兩個(gè)屬性來設(shè)置客戶端訪CrossDomainXmlFile、CrossDomainXmlContent相同,這里不再詳細(xì)關(guān)于crossdomain.xml和clientaccesspolicy.xmlserver.IsCrossDomainEnabled=true;server.IsP3pEnabled=true;server.Mode=Hprose.IO.HproseMode.PropertyMode;服務(wù)器事件http頭,或者希望在發(fā)生錯(cuò)誤時(shí),能夠在服務(wù)器端進(jìn)行日志記錄。甚至希望在調(diào)用發(fā)生的前后可以做一些權(quán)限檢查或日志記錄等。在Hprose中,這些都可以輕松做到。Hprose服務(wù)器事件http頭,或者希望在發(fā)生錯(cuò)誤時(shí),能夠在服務(wù)器端進(jìn)行日志記錄。甚至希望在調(diào)用發(fā)生的前后可以做一些權(quán)限檢查或日志記錄等。在Hprose中,這些都可以輕松做到。Hprose它們分別對(duì)應(yīng)Hprose 事args為方法的參數(shù),byRefIP驗(yàn)證。也可以作日志記錄。如果在該事件中想終止調(diào)用,OnAfterIn 事result 事當(dāng)服務(wù)器返回響應(yīng)頭部時(shí),OnSendHeaderCookie 事OnBeforeInvoke、OnAfterInvoke事件中拋出異常時(shí),該事件被觸namespaceHprose.ServerpublicdelegatevoidBeforeInvokeEvent(stringname,object[]args,boolpublicdelegatevoidAfterInvokeEvent(stringname,object[]args,boolbyRef,objectresult);publicdelegatevoidSendHeaderEvent();publicdelegatevoidSendErrorEvent(string}存取環(huán)境上下文在上面介紹的服務(wù)器事件中,您可能會(huì)需要存取環(huán)境上下文,例如Request,Response存取環(huán)境上下文在上面介紹的服務(wù)器事件中,您可能會(huì)需要存取環(huán)境上下文,例如Request,Response。那么有什么HproseIISHproseHttpListenerService類的CurrentContextCurrentContextHttpListenerContextRequest、Response、User屬性來存取這些上下文。HproseHttpListenerServiceCurrentContext靜態(tài)屬性可以在服務(wù)器事件中使用,也可以在服務(wù)器發(fā)布的方法中使用。另外,在服務(wù)器發(fā)布的方法中還有另外一種方式來獲取環(huán)境上下文,那就是將方法的例如要獲取RequestHttpListenerRequest類型即可。客戶端在調(diào)用該方法時(shí),不需要代入這個(gè)參數(shù),服務(wù)器會(huì)自動(dòng)傳遞Request參數(shù)給該方法。HttpListenerContext本身和它所包含的所有的環(huán)境上下文類型,但是一次只能斷服務(wù)是否啟動(dòng),通過Stop方法來停止服務(wù)。有了這些,你完全可以做一個(gè)Winform控制的服務(wù)器了。通過aspx方式發(fā)布服以獨(dú)立服務(wù)器方式發(fā)布服務(wù)時(shí),發(fā)布的所有方法都是全局的,也就是說服務(wù)對(duì)象從服務(wù)器啟動(dòng)時(shí)被創(chuàng)Application這些環(huán)境上下文進(jìn)行操作。進(jìn)行操作。那么你可以選擇以aspx方式發(fā)布服務(wù)。按全局發(fā)布方法aspx的Bin目錄下:然后在發(fā)布目錄下創(chuàng)建一個(gè)App_Code<%@ApplicationLanguage="C#"<objectid="ExamService"class="Hprose.Server.HproseHttpService"runat="server"scope="application"<scriptvoidApplication_Start(objectsender,EventArgs{Exam1exam1=newExam1();Exam2exam2=newExam2();ExamService.GlobalMethods.AddInstanceMethods(exam1,"ex1");ExamService.GlobalMethods.AddInstanceMethods(exam2,typeof(Exam1),"ex2");ExamService.GlobalMethods.AddInstanceMethods(exam2,typeof(Exam2),"ex2");ExamService.Mode=Hprose.IO.HproseMode.PropertyMode;ExamService.IsDebugEnabled=true;ExamService.IsP3pEnabled=true;ExamService.IsCrossDomainEnabled=true;}上面的代碼我們創(chuàng)建了一個(gè)全局的ExamServiceApplication_Start事件中對(duì)其進(jìn)行了初始化。ExamServiceHproseHttpService類型的,它是一個(gè)線程安全的類,因此它可以被創(chuàng)建為全局對(duì)象。上面的代碼我們創(chuàng)建了一個(gè)全局的ExamServiceApplication_Start事件中對(duì)其進(jìn)行了初始化。ExamServiceHproseHttpService類型的,它是一個(gè)線程安全的類,因此它可以被創(chuàng)建為全局對(duì)象。性功能是一樣的,雖然它與獨(dú)立服務(wù)器的Methods屬性并不是相同的類,但它們的父類是相同的,都是HproseMethods類型。ExamServiceModeIsDebugEnabledIsP3pEnabledIsGetEnabledIsCrossDomainEnabledCrossDomainXmlFile、兩個(gè)文件可以直接放在IIS的發(fā)布目錄下,而無需通過Hprose來配置。aspx注意,如果采用CodeBehind這是因?yàn)镃odeBehindExamService這個(gè)對(duì)象。asaxaspxUTF-8BOM。aspxhtml按會(huì)話發(fā)布方法<%@ApplicationLanguage="C#"<objectid="ExamService"class="Hprose.Server.HproseHttpService"runat="server"scope="application"<objectid="exam1"class="Exam1"runat="server"scope="session"<objectid="exam2"class="Exam2"runat="server"scope="session"<objectid="ExamService"class="Hprose.Server.HproseHttpService"runat="server"scope="application"<%@PageLanguage="C#"<scriptvoidPage_Load(objectsender,EventArgs{}這里我們?cè)趧?chuàng)建了ExamService之后并沒有為它的GlobalMethodsSessionmethodsGlobalMethods這里我們?cè)趧?chuàng)建了ExamService之后并沒有為它的GlobalMethodsSessionmethodsGlobalMethods是屬于同一個(gè)類型的,之后,我們?cè)诿總€(gè)頁面被載入時(shí),將methods對(duì)象作為參數(shù)傳入了ExamServiceHandle方法。按請(qǐng)求發(fā)布方法<%@ApplicationLanguage="C#"<objectid="ExamService"class="Hprose.Server.HproseHttpService"runat="server"scope="application"<scriptvoidApplication_Start(objectsender,EventArgs{ExamService.Mode=Hprose.IO.HproseMode.PropertyMode;ExamService.IsDebugEnabled=true;ExamService.IsP3pEnabled=true;ExamService.IsCrossDomainEnabled=true;}<%@PageLanguage="C#"<scriptvoidPage_Load(objectsender,EventArgs{}<objectid="methods"class="Hprose.Server.HproseHttpMethods"runat="server"scope="session"<scriptvoidApplication_Start(objectsender,EventArgs{ExamService.Mode=Hprose.IO.HproseMode.PropertyMode;ExamService.IsDebugEnabled=true;ExamService.IsP3pEnabled=true;ExamService.IsCrossDomainEnabled=true;}voidSession_Start(objectsender,EventArgs{methods.AddInstanceMethods(exam1,"ex1");methods.AddInstanceMethods(exam2,typeof(Exam1),"ex2");methods.AddInstanceMethods(exam2,typeof(Exam2),}存取環(huán)境上下文aspx存取環(huán)境上下文aspxHttpContext.CurrentHproseHttpService的靜另一種方法與獨(dú)立服務(wù)器方式類似,就是通過發(fā)布方法的最后一個(gè)參數(shù)傳入,這種方法我們不推薦用戶使用,僅為與PHPRPC兼容而準(zhǔn)備。所以,這里我們不對(duì)該方式進(jìn)行詳細(xì)介紹。通過自定義處理程序來發(fā)布服務(wù)除了直接以aspxHTTPusingSystem.Web;publicclassHproseHttpHandler:IHttpHandlerprivatestaticHproseHttpServiceservice=newHproseHttpService();staticHproseHttpHandler(){Exam1exam1=newExam2exam2=newExam2();service.GlobalMethods.AddInstanceMethods(exam1,"ex1");service.GlobalMethods.AddInstanceMethods(exam2,typeof(Exam1),"ex2");service.GlobalMethods.AddInstanceMethods(exam2,typeof(Exam2),<%@PageLanguage="C#"<%@ImportNameSpace="Hprose.Server"<scriptvoidPage_Load(objectsender,EventArgs{Exam1exam1=newExam1();Exam2exam2=newExam2();HproseHttpMethodsmethods=newHproseHttpMethods();methods.AddInstanceMethods(exam1,"ex1");methods.AddInstanceMethods(exam2,typeof(Exam1),"ex2");methods.AddInstanceMethods(exam2,typeof(Exam2),"ex2");}service.Mode=Hprose.IO.HproseMode.PropertyMode;service.IsDebugEnabled=true;service.IsP3pEnabled=true;service.IsCrossDomainEnabled=true;}publicvoidProcessRequest(HttpContext{}publicbool{get{returntrue;}}HproseforC#客戶端,在本章中您將深入的了解HproseHproseforC#客戶端,在本章中您將深入的了解HproseforC#客戶端的更多細(xì)節(jié)。本章提要HTTP同步調(diào)用Hprose客戶端在與服務(wù)器通訊時(shí),分同步調(diào)用和異步調(diào)用兩種方式。同步調(diào)用的概念和用法相對(duì)簡(jiǎn)單同步調(diào)用Hprose客戶端在與服務(wù)器通訊時(shí),分同步調(diào)用和異步調(diào)用兩種方式。同步調(diào)用的概念和用法相對(duì)簡(jiǎn)單CompactFramework中,只能使用Invoke方法。通過Invoke方法進(jìn)行同步調(diào)用通過Invoke帶名稱空間(別名前綴)方法法是為了兼容.NETFramework1.0、1.1和.NETCompactFramework1.0的,通常我們現(xiàn)在使用的是.NETFramework都是2.0以上的版本,因此推薦使用范型版本。可變的參數(shù)和結(jié)果類型下面我們?cè)賮砜磳?duì)SumHproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");Console.WriteLine(client.Invoke("ex1_sum",newObject[]{newint[]{1,2,3,4,5}}));HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");因?yàn)?,Sumex1ex2的前綴,雖然這兩個(gè)方法對(duì)應(yīng)服務(wù)器上不同對(duì)大家還會(huì)發(fā)現(xiàn),Sumint[]因?yàn)?,Sumex1ex2的前綴,雖然這兩個(gè)方法對(duì)應(yīng)服務(wù)器上不同對(duì)大家還會(huì)發(fā)現(xiàn),Sumint[]intint[]short[]、long[]ArrayListint引用參數(shù)傳遞HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");Hashtablemap=newHashtable();map["January"]=Object[]arguments=newObject[]{map};client.Invoke("ex1_swapKeyAndValue",arguments);foreach(DictionaryEntryeinmap){Console.WriteLine("Key={0},Value={1}",e.Key,}foreach(DictionaryEntryein{Console.WriteLine("Key={0},Value={1}",e.Key,}client.Invoke("ex2_swapKeyAndValue",arguments,true);foreach(DictionaryEntryeinmap){Console.WriteLine(client.Invoke("ex1_sum",newObject[]{newshort[]{6,7,8,9,10}}));Console.WriteLine(client.Invoke("ex1_sum",newObject[]{newlong[]{11,12,13,14,15}}));Console.WriteLine(client.Invoke("ex1_sum",newObject[]{newdouble[]{16,17,18,19,20}}));Console.WriteLine(client.Invoke("ex1_sum",newObject[]{newstring[]{"21","22","23","24","25"}}));ArrayListintList=newArrayList();Console.WriteLine(client.Invoke("ex2_sum",newObject[]{intListarguments[0]的值也發(fā)生了變化,但是需要注意的是,maparguments[0]的值也發(fā)生了變化,但是需要注意的是,maparguments自定義類型的傳輸最后我們來看一下對(duì)getUserListname:Amy,age:26,sex:Female,birthday:1983-12-30:00:00,married:HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");List<User>userList=client.Invoke<List<User>>("ex2_getUserList");foreach(UseruserinuserList){Console.Write("name:{0},",Console.Write("age:{0},",Console.Write("sex:{0},",user.Sex);Console.Write("birthday:{0},",user.Birthday);Console.Write("married:{0}.",user.Married);}User[]users=client.Invoke<User[]>("ex2_getUserList");foreach(Useruserinusers){Console.Write("name:{0},",Console.Write("age:{0},",Console.Write("sex:{0},",user.Sex);Console.Write("birthday:{0},",user.Birthday);Console.Write("married:{0}.",user.Married);}Key=January,Value=JanKey=January,Value=JanKey=January,Value=JanKey=Jan,}foreach(DictionaryEntryein{Console.WriteLine("Key={0},Value={1}",e.Key,結(jié)果都是正確的。這是因?yàn)镠prose在接收數(shù)據(jù)時(shí)自動(dòng)將數(shù)據(jù)反序列化成了我們指定的類型。List更高效和結(jié)果都是正確的。這是因?yàn)镠prose在接收數(shù)據(jù)時(shí)自動(dòng)將數(shù)據(jù)反序列化成了我們指定的類型。List更高效和通過代理接口進(jìn)行同步調(diào)用看完通過Invoke接口定義Exam1Exam1這個(gè)接口與Exam2User[]publicinterface{User[]}publicinterface{stringGetId();intSum(int[]nums);intSum(short[]nums);intSum(long[]nums);intSum(double[]nums);intSum(string[]doubleSum(ArrayListDictionary<String,String>SwapKeyAndValue(Dictionary<String,String>strmap);Dictionary<String,String>SwapKeyAndValue(refDictionary<String,String>strmap);}name:Bob,age:20,sex:Male,birthday:1989-6-120:00:00,married:False.name:Chris,age:29,sex:Unknown,birthday:1980-3-80:00:00,married:True.name:Alex,age:17,sex:InterSex,birthday:1992-6-140:00:00,married:F:Amy,age:26,sex:Female,birthday:1983-12-30:00:00,married:True.name:Bob,age:20,sex:Male,birthday:1989-6-120:00:00,married:False.name:Chris,age:29,sex:Unknown,birthday:1980-3-80:00:00,married:True.name:Alex,age:17,sex:InterSex,birthday:1992-6-140:00:00,married:False.從上面的接口我們可以看出,在Hprose帶名稱空間(別名前綴)方從上面的接口我們可以看出,在Hprose帶名稱空間(別名前綴)方法Invoke對(duì)帶有名稱空間(別名前綴)在這個(gè)例子中,exam1exam2IExam1的接口對(duì)象,exam1UseService方法得的GetId方法調(diào)用時(shí),調(diào)用的就是兩個(gè)不同的方法了??勺兊膮?shù)和結(jié)果類型下面我們?cè)賮砜磳?duì)Sum需要事先將接口定義好才可以。用接口方式就不需要在調(diào)用時(shí)指定返回值類型了,Hprose自動(dòng)從接口聲明HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");IExam1exam=client.UseService<IExam1>("ex1");Console.WriteLine(exam.Sum(newint[]{1,2,3,4,5}));Console.WriteLine(exam.Sum(newshort[]Console.WriteLine(exam.Sum(newlong[]Console.WriteLine(exam.Sum(newdouble[]Console.WriteLine(exam.Sum(newstring[]{"21","22","23","24","25"}));ArrayListintList=newArrayList();HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");IExam1exam1=(IExam1)client.UseService(typeof(IExam1),"ex1");IExam1exam2=泛型參數(shù)和引用參數(shù)傳遞當(dāng)參數(shù)在接口聲明中被標(biāo)記為ref泛型參數(shù)和引用參數(shù)傳遞當(dāng)參數(shù)在接口聲明中被標(biāo)記為refout自定義類型HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");IExam2exam=client.UseService<IExam2>("ex2");User[]users=foreach(Useruserinusers){Console.Write("name:{0},",user.Name);Console.Write("age:{0},",Console.Write("sex:{0},",user.Sex);Console.Write("birthday:{0},",user.Birthday);Console.Write("married:{0}.",user.Married);}Key=January,Value=JanKey=January,Value=JanKey=Jan,HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");IExam1exam=client.UseService<IExam1>("ex1");Dictionary<String,String>map=newDictionary<String,String>();map["January"]="Jan";foreach(KeyValuePair<String,String>ein{Console.WriteLine("Key={0},Value={1}",e.Key,}foreach(KeyValuePair<String,String>ein{Console.WriteLine("Key={0},Value={1}",e.Key,}exam.SwapKeyAndValue(refforeach(KeyValuePair<String,String>ein異步調(diào)用很多時(shí)候我們并不確定在進(jìn)行遠(yuǎn)程調(diào)用時(shí)是否能夠立即得到返回結(jié)果,因?yàn)榭赡苡捎趲拞栴}或者服務(wù)器本身需要對(duì)此調(diào)用進(jìn)行長時(shí)間計(jì)算而不能馬上返回結(jié)果給客戶端。這種情況下,如果使用同步遠(yuǎn)程調(diào)用,客戶端執(zhí)行該調(diào)用的線程將被阻塞,并且在主線程中執(zhí)行同步遠(yuǎn)程調(diào)用會(huì)造成用戶界面凍結(jié),這是用異步調(diào)用很多時(shí)候我們并不確定在進(jìn)行遠(yuǎn)程調(diào)用時(shí)是否能夠立即得到返回結(jié)果,因?yàn)榭赡苡捎趲拞栴}或者服務(wù)器本身需要對(duì)此調(diào)用進(jìn)行長時(shí)間計(jì)算而不能馬上返回結(jié)果給客戶端。這種情況下,如果使用同步遠(yuǎn)程調(diào)用,客戶端執(zhí)行該調(diào)用的線程將被阻塞,并且在主線程中執(zhí)行同步遠(yuǎn)程調(diào)用會(huì)造成用戶界面凍結(jié),這是用WinForm、WPF程序中我們應(yīng)該使用異步調(diào)用而不應(yīng)該使用同步調(diào)用,SilverLight更是強(qiáng)制性的必須使用異步調(diào)用,因?yàn)樵赟ilverLight上是沒有同步調(diào)用支持的。Hprose在.NETCompactFrameworkInvoke通過Invoke方法進(jìn)行異步調(diào)用通過Invoke其中,前兩個(gè)是范型委托,后兩個(gè)是非泛型委托。通常在.NET2.0及其更高版本上面使用范型委托,而非泛型委托是為.NETFramework1.0、1.1和.NETCompactFramework1.0準(zhǔn)備的。么第二個(gè)參數(shù)的參數(shù)值,跟您調(diào)用時(shí)的參數(shù)值是一致的。在非引用參數(shù)傳遞調(diào)用中,如果您在處理結(jié)果的當(dāng)您通過Invoke所調(diào)用的方法執(zhí)行完畢時(shí),您所指定的回調(diào)方法將會(huì)被調(diào)用,其中的參將會(huì)自動(dòng)被傳關(guān)于通過Invoke進(jìn)行異步調(diào)用,我想不用舉太多例子,下面這個(gè)簡(jiǎn)單的例子就可以很好的說明如何來publicdelegatevoidHproseCallback<T>(Tresult,object[]args);publicdelegatevoidHproseCallback1<T>(Tresult);publicdelegatevoidHproseCallback(objectresult,object[]publicdelegatevoidHproseCallback1(objectname:Amy,age:26,sex:Female,birthday:1983-12-03,married:true.name:Bob,age:20,sex:Male,birthday:1989-06-12,married:false.name:Chris,age:29,sex:Unknown,birthday:1980-03-08,married:true.name:Alex,age:17,sex:InterSex,birthday:1992-06-14,married:在.NET在.NET2.0newHproseCallback1的情況下,.NET無法推斷出要調(diào)用的是范型版本還是非范型版本的方法。而如果使用的是.NET1.0、1.1,雖然不會(huì)有范型還是要必須寫,而且還不能夠使用匿名方法,因?yàn)?NET1.0、1.1不支持。ex1_getIdInvoke方法的范型版本,但實(shí)際上它調(diào)用的ex2_getIdlambdaex2_getIdlambdaInvoke采用的是范型形式,所以這result的類型為string類型。您可能還注意到,我們?cè)诔绦虻淖詈蠹由狭薈onsole.ReadKey(),因?yàn)檫@里是異步調(diào)用,如果不加這一句,調(diào)用還沒有執(zhí)行完,程序就已經(jīng)退出了,這樣您將看不到任何執(zhí)行結(jié)果。不過一般情況下,都是在圖形用戶界面的程序中才會(huì)使用異步調(diào)用,所以,在那種情況下,您可能需要用其它方法來保證異步調(diào)用被通過代理接口進(jìn)行異步調(diào)用除了可以通過InvokeHproseHttpClientclient=newclient.Invoke("ex1_getId",newHproseCallback1(delegate(objectresult){Console.WriteLine(result);}));client.Invoke("ex1_getId",delegate(stringresult){Console.WriteLine(result);});client.Invoke("ex2_getId",(result)=>{Console.WriteLine(result);});client.Invoke<string>("ex2_getId",(result)=>{Console.WriteLine(result);});HproseHttpClientclient=HproseHttpClientclient=newHproseHttpClient("http://localhost:2010/");IAsyncExamexam=client.UseService<IAsyncExam>("ex2");Hashtablemap=newHashtable();map["January"]="Jan";exam.SwapKeyAndValue(map,(result,arguments){foreach(DictionaryEntryeinmap){Console.WriteLine("Key={0},Value={1}",e.Key,e.Value);}foreach(DictionaryEntryein{Console.WriteLine("Key={0},Value={1}",e.Key,}foreach(DictionaryEntryein{Console.WriteLine("Key={0},Value={1}",e.Key,}exam.SwapKeyAndValue(refmap,(result,arguments){foreach(DictionaryEntryeinmap){Console.WriteLine("Key={0},Value={1}",e.Key,e.Value);}foreach(DictionaryEntryein{Console.WriteLine("Key={0},Value={1}",e.Key,}foreach(DictionaryEntryein{Console.WriteLine("Key={0},Value={1}",e.Key,}exam.GetUserList((result){

溫馨提示

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

評(píng)論

0/150

提交評(píng)論