Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
件是不是一種委托?
委托是一種安全的函數(shù)指針,事件是一種消息機(jī)制
委托與事件是什么關(guān)系?為什么要使用委托
委托提供了封裝方法的方式,事件是某動(dòng)作已發(fā)生的說(shuō)明,事件是建立于委托之上的
程序運(yùn)行時(shí)同一個(gè)委托能夠用來(lái)調(diào)用不同的方法,只要改變它的引用方法即可,因此委托調(diào)節(jié)器用的方法不是在編譯時(shí)決定的,而是在運(yùn)行時(shí)確定的.
請(qǐng)解釋這種語(yǔ)法現(xiàn)象Session[“name”]=20;
給類的索引器賦值.
ASP.Net的身份驗(yàn)證方式有哪些?分別是什么原理?
Asp.net的身份驗(yàn)證有有三種,分別是"Windows | Forms | Passport",
window驗(yàn)證: ASP.NET 會(huì)結(jié)合信息服務(wù) (IIS),為每個(gè)用戶開(kāi)啟window帳號(hào),驗(yàn)證其身份,安全性較高。
forms驗(yàn)證:為每個(gè)登陸用戶寫(xiě)入一個(gè)身份驗(yàn)證票據(jù),在web使用最廣的驗(yàn)證方式,靈活方便。
passport驗(yàn)證:由 Microsoft 提供的集中身份驗(yàn)證服務(wù),該服務(wù)為成員站點(diǎn)提供單一登錄和核心配置
什么是code-Behind技術(shù)。
就是代碼隱藏,在ASP.NET中通過(guò)ASPX頁(yè)面指向CS文件的方法實(shí)現(xiàn)顯示邏輯和處理邏輯的分離,這樣有助于web應(yīng)用程序的創(chuàng)建。比如分工,美工和編程的可以個(gè)干各的,不用再像以前asp那樣都代碼和html代碼混在一起,難以維護(hù)。
新建一個(gè)VS.Net下的項(xiàng)目。??吹紸SPX,RESX和CS三個(gè)后綴的文件,這個(gè)就是代碼分離。實(shí)現(xiàn)了HTML代碼和服務(wù)器代碼分離,方便代碼編寫(xiě)和整理。
活動(dòng)目錄。
活動(dòng)目錄是window2000的最重要的功能??梢詫⒂脩粜畔⑷考善饋?lái),登陸以后可以訪問(wèn)多個(gè)不同的網(wǎng)絡(luò)服務(wù)。。
活動(dòng)目錄包括兩個(gè)方面:目錄和與目錄相關(guān)的服務(wù)。安裝了活動(dòng)目錄的計(jì)算機(jī)稱為“域控制器”,對(duì)于用戶而言,只要加入并接受域控制器的管理就可以在一次登錄之后全網(wǎng)使用,方便地訪問(wèn)活動(dòng)目錄提供的網(wǎng)絡(luò)資源。對(duì)于管理員,則可以通過(guò)對(duì)活動(dòng)目錄的集中管理就能夠管理全網(wǎng)的資源。
.Net中讀寫(xiě)XML的類都?xì)w屬于哪些命名空間?
System.XML命名空間,任何類型的項(xiàng)目都可以通過(guò)System.XML命名空間進(jìn)行XML處理。使用System.Xml命名空間中的XmlDocument類來(lái)操作xml的數(shù)據(jù)
C#中 Socket所在的命名空間是?
System.Net.Sockets。 Socket 類為網(wǎng)絡(luò)通信提供了一套豐富的方法和屬性。Socket 類允許您使用 ProtocolType 枚舉中所列出的任何一種協(xié)議執(zhí)行異步和同步數(shù)據(jù)傳輸。
什么是SOAP,有哪些應(yīng)用。
SOAP(Simple Object Access Protocol )簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議是在分散或分布式的環(huán)境中交換信息并執(zhí)行遠(yuǎn)程過(guò)程調(diào)用的協(xié)議,是一個(gè)基于XML的協(xié)議。使用SOAP,不用考慮任何特定的傳輸協(xié)議(最常用的還是HTTP協(xié)議),可以允許任何類型的對(duì)象或代碼,在任何平臺(tái)上,以任何一直語(yǔ)言相互通信。這種相互通信采用的是XML格式的消息。
SOAP 是一種輕量級(jí)協(xié)議,用于在分散型、分布式環(huán)境中交換結(jié)構(gòu)化信息。 SOAP 利用 XML 技術(shù)定義一種可擴(kuò)展的消息處理框架,它提供了一種可通過(guò)多種底層協(xié)議進(jìn)行交換的消息結(jié)構(gòu)。 這種框架的設(shè)計(jì)思想是要獨(dú)立于任何一種特定的編程模型和其他特定實(shí)現(xiàn)的語(yǔ)義。
如何理解.Net中的垃圾回收機(jī)制。
垃圾回收器每次進(jìn)行垃圾回收時(shí),對(duì)堆上的對(duì)象進(jìn)行檢查,把沒(méi)有被任何變量引用的對(duì)象銷毀。但并不是檢查堆上的每個(gè)對(duì)象,而是將對(duì)象進(jìn)行分類,將所有對(duì)象分類三代(generation)。生命周期越短(新創(chuàng)建的對(duì)象)代數(shù)越小,反之越大。
在堆空間不夠用時(shí),垃圾回收器回收垃圾,檢查第0代對(duì)象,如果發(fā)現(xiàn)沒(méi)有被引用的對(duì)象,則標(biāo)記這些為“垃圾”,并銷毀。而幸存的部分的第0代對(duì)象將升級(jí)為第1代對(duì)象,某些標(biāo)記為“垃圾”的對(duì)象也會(huì)幸存而升級(jí)。這時(shí)如果堆空間仍然不夠用(如創(chuàng)建比較大的新對(duì)象),垃圾收集器將會(huì)檢查第1代對(duì)象,將沒(méi)有引用的對(duì)象進(jìn)行銷毀。幸存部分升級(jí)為第2代對(duì)象,當(dāng)內(nèi)存堆空間仍然不夠用時(shí),檢查第2代對(duì)象,不過(guò)第2代對(duì)象檢查后仍然是第2代對(duì)象,不會(huì)繼續(xù)升級(jí)。
如果發(fā)現(xiàn)內(nèi)存不夠,則垃圾回收器,將全部對(duì)象作為無(wú)效對(duì)象(被回收對(duì)象),然后先將全局變量,static,處于活動(dòng)中的局部變量,以及當(dāng)前CG指針指向的對(duì)象放入一個(gè)表中。然后會(huì)搜索新列表中的對(duì)象所引用的對(duì)象,加入列表中,其他沒(méi)有被加入列表的對(duì)象都會(huì)被回收。
垃圾回收器優(yōu)化引擎根據(jù)正在進(jìn)行的分配情況確定執(zhí)行回收的最佳時(shí)間。當(dāng)垃圾回收器執(zhí)行回收時(shí),它檢查托管堆中不再被應(yīng)用程序使用的對(duì)象并執(zhí)行必要的操作來(lái)回收它們占用的內(nèi)存。
三個(gè)generation,當(dāng)每個(gè)generation內(nèi)存滿了的時(shí)候檢查引用,無(wú)引用就回收內(nèi)存
常用的調(diào)用webservice方法有哪些?
1.使用WSDL.exe命令行工具。
2.使用VS.NET中的Add Web Reference菜單選項(xiàng)
什么是XML?列舉一下你所了解的XML技術(shù)及其應(yīng)用
XML即可擴(kuò)展標(biāo)記語(yǔ)言。eXtensible Markup Language.標(biāo)記是指計(jì)算機(jī)所能理解的信息符號(hào),通過(guò)此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種信息的文章等。如何定義這些標(biāo)記,即可以選擇國(guó)際通用的標(biāo)記語(yǔ)言,比如HTML,也可以使用象XML這樣由相關(guān)人士自由決定的標(biāo)記語(yǔ)言,這就是語(yǔ)言的可擴(kuò)展性。XML是從SGML中簡(jiǎn)化修改出來(lái)的。它主要用到的有XML、XSL和XPath等。
xml可以用來(lái)做網(wǎng)頁(yè)(xslt);xml可以當(dāng)作數(shù)據(jù)庫(kù);xml可以用來(lái)保存對(duì)象的系列化;xml用于配置;用于保存靜態(tài)數(shù)據(jù)類型。接觸XML最多的是web Services和config
XML 與 HTML 的主要區(qū)別
1. XML是區(qū)分大小寫(xiě)字母的,HTML不區(qū)分。
2. XML中,絕對(duì)不能省略掉結(jié)束標(biāo)記。在HTML中,如果上下文清楚地顯示出段落或者列表鍵在何處結(jié)尾,那么你可以省略</p>或者</li>之類的結(jié)束 標(biāo)記。
3. 在XML中,擁有單個(gè)標(biāo)記而沒(méi)有匹配的結(jié)束標(biāo)記的元素必須用一個(gè) / 字符作為結(jié)尾。這樣分析器就知道不用 查找結(jié)束標(biāo)記了。
4. 在XML中,屬性值必須在引號(hào)中。在HTML中,引號(hào)是可用可不用的。
5. 在XML中,所有的屬性都必須帶有相應(yīng)的值。在HTML中,可以擁有不帶值的屬性名。
C#中property與attribute的區(qū)別,他們各有什么用處,這種機(jī)制的好處在哪里?
property和attribute漢語(yǔ)都稱之為屬性。
property一個(gè)是屬性,用于存取類的字段,類向外提供的數(shù)據(jù)區(qū)域,
attribute一個(gè)是特性,用來(lái)標(biāo)識(shí)類,方法等的附加性質(zhì), 描述對(duì)象在編譯時(shí)或運(yùn)行時(shí)屬性的.
C#可否對(duì)內(nèi)存進(jìn)行直接的操作?
這個(gè)問(wèn)題比較難回答,也是個(gè)很大的問(wèn)題。但是可以這樣問(wèn)答。C#是可以對(duì)內(nèi)存進(jìn)行直接操作的,雖然很少用到指針,但是C#是可以使用指針的,在用的時(shí)候需要在前邊加unsafe,,在.net中使用了垃圾回收機(jī)制(GC)功能,它替代了程序員,不過(guò)在C#中不可以直接使用finalize方法,而是在析構(gòu)函數(shù)中調(diào)用基類的finalize()方法。
用最有效的方法算出2的3次方8等于幾?
2<<3.
維護(hù)數(shù)據(jù)庫(kù)的完整性、一致性、你喜歡用觸發(fā)器還是自寫(xiě)業(yè)務(wù)邏輯?為什么
觸發(fā)器,性能好,事務(wù)性
ADO.NET相對(duì)于ADO等主要有什么改進(jìn)?
簡(jiǎn)單的說(shuō),ADO.NET新增dataset等,不需要隨時(shí)保持連接,性能提高.
1:ADO.Net不依賴于ole db提供程序,而是使用.net托管提供的程序,
2:不使用com
3:不在支持動(dòng)態(tài)游標(biāo)和服務(wù)器端游
4:,可以斷開(kāi)connection而保留當(dāng)前數(shù)據(jù)集可用
5:強(qiáng)類型轉(zhuǎn)換
6:xml支持
您可以通過(guò)將 ADO.NET 的各項(xiàng)功能與 ActiveX 數(shù)據(jù)對(duì)象 (ADO) 的特定功能進(jìn)行比較來(lái)理解 ADO.NET 的功能。
1、數(shù)據(jù)的內(nèi)存中表示形式
在 ADO 中,數(shù)據(jù)的內(nèi)存中表示形式為記錄集。在 ADO.NET 中,它為數(shù)據(jù)集。它們之間有重要的差異。
2、表的個(gè)數(shù)
記錄集看起來(lái)像單個(gè)表。如果記錄集將包含來(lái)自多個(gè)數(shù)據(jù)庫(kù)表的數(shù)據(jù),則它必須使用 JOIN 查詢,將來(lái)自各個(gè)數(shù)據(jù)庫(kù)表的數(shù)據(jù)組合到單個(gè)結(jié)果表中。 相反,數(shù)據(jù)集是一個(gè)或多個(gè)表的集合。數(shù)據(jù)集內(nèi)的表稱為數(shù)據(jù)表;明確地說(shuō),它們是 DataTable 對(duì)象。如果數(shù)據(jù)集包含來(lái)自多個(gè)數(shù)據(jù)庫(kù)表的數(shù)據(jù),它通常將包含多個(gè) DataTable 對(duì)象。即,每個(gè) DataTable 對(duì)象通常對(duì)應(yīng)于單個(gè)數(shù)據(jù)庫(kù)表或視圖。這樣,數(shù)據(jù)集可以模仿基礎(chǔ)數(shù)據(jù)庫(kù)的結(jié)構(gòu)。
數(shù)據(jù)集通常還包含關(guān)系。數(shù)據(jù)集內(nèi)的關(guān)系類似于數(shù)據(jù)庫(kù)中的外鍵關(guān)系,即它使多個(gè)表中的行彼此關(guān)聯(lián)。例如,如果數(shù)據(jù)集包含一個(gè)有關(guān)投資者的表和另一個(gè)有關(guān)每個(gè)投資者的股票購(gòu)買(mǎi)情況的表,則數(shù)據(jù)集可能還包含一個(gè)關(guān)系來(lái)連接投資者表的各個(gè)行和購(gòu)買(mǎi)表的對(duì)應(yīng)行。
由于數(shù)據(jù)集可以保存多個(gè)獨(dú)立的表并維護(hù)有關(guān)表之間關(guān)系的信息,因此它可以保存比記錄集豐富得多的數(shù)據(jù)結(jié)構(gòu),包括自關(guān)聯(lián)的表和具有多對(duì)多關(guān)系的表。
3、數(shù)據(jù)導(dǎo)航和游標(biāo)
在 ADO 中,您使用 ADO MoveNext 方法順序掃描記錄集的行。在 ADO.NET 中,行表示為集合,因此您可以像依次通過(guò)任何集合那樣依次通過(guò)表,或通過(guò)序號(hào)索引或主鍵索引訪問(wèn)特定行。DataRelation 對(duì)象維護(hù)有關(guān)主記錄和詳細(xì)資料記錄的信息,并提供方法使您可以獲取與正在操作的記錄相關(guān)的記錄。例如,從 Investor 表的"Nate Sun"的行開(kāi)始,可以定位到 Purchase 表中描述其購(gòu)買(mǎi)情況的那組行。
"游標(biāo)"是數(shù)據(jù)庫(kù)元素,它控制記錄導(dǎo)航、更新數(shù)據(jù)的能力和其他用戶對(duì)數(shù)據(jù)庫(kù)所做更改的可見(jiàn)性。ADO.NET 不具有固有的游標(biāo)對(duì)象,而是包含提供傳統(tǒng)游標(biāo)功能的數(shù)據(jù)類。例如,在 ADO.NET DataReader 對(duì)象中提供只進(jìn)、只讀游標(biāo)的功能。有關(guān)游標(biāo)功能的更多信息,請(qǐng)參見(jiàn)數(shù)據(jù)訪問(wèn)技術(shù)。
4、將打開(kāi)連接的時(shí)間降至最低
在 ADO.NET 中,打開(kāi)連接的時(shí)間僅足夠執(zhí)行數(shù)據(jù)庫(kù)操作,例如"選擇"(Select) 或"更新"(Update)。您可以將行讀入數(shù)據(jù)集中,然后在不保持與數(shù)據(jù)源的連接的情況下使用它們。
在 ADO 中,記錄集可以提供不連接的訪問(wèn),但 ADO 主要是為連接的訪問(wèn)設(shè)計(jì)的。
ADO 和 ADO.NET 中的不連接處理之間存在一個(gè)顯著差異。在 ADO 中,通過(guò)調(diào)用 OLE DB 提供程序來(lái)與數(shù)據(jù)庫(kù)通信。但在 ADO.NET 中,您通過(guò)數(shù)據(jù)適配器(OleDbDataAdapter、SqlDataAdapter、OdbcDataAdapter 或 OracleDataAdapter 對(duì)象)與數(shù)據(jù)庫(kù)通信,這將調(diào)用 OLE DB 提供程序或基礎(chǔ)數(shù)據(jù)源提供的 API。ADO 和 ADO.NET 之間的主要區(qū)別在于:
在 ADO.NET 中,數(shù)據(jù)適配器允許您控制將對(duì)數(shù)據(jù)集所做的更改傳輸?shù)綌?shù)據(jù)庫(kù)的方式,方法是實(shí)現(xiàn)性能優(yōu)化、執(zhí)行數(shù)據(jù)驗(yàn)證檢查或添加其他任何額外處理。
注意:數(shù)據(jù)適配器、數(shù)據(jù)連接、數(shù)據(jù)命令和數(shù)據(jù)讀取器是組成 .NET Framework 數(shù)據(jù)提供程序的組件。Microsoft 和第三方供應(yīng)商可能會(huì)提供其它提供程序,這些提供程序也可集成到 Visual Studio 中。有關(guān)不同 .NET 數(shù)據(jù)提供程序的信息,請(qǐng)參見(jiàn) .NET 數(shù)據(jù)提供程序。
5、在應(yīng)用程序間共享數(shù)據(jù)
在應(yīng)用程序間傳輸 ADO.NET 數(shù)據(jù)集比傳輸 ADO 不連接的記錄集要容易得多。若要將 ADO 不連接的記錄集從一個(gè)組件傳輸?shù)搅硪粋€(gè)組件,請(qǐng)使用 COM 封送。若要在 ADO.NET 中傳輸數(shù)據(jù),請(qǐng)使用數(shù)據(jù)集,它可以傳輸 XML 流。 相對(duì)于 COM 封送,XML 文件的傳輸提供以下便利之處:
更豐富的數(shù)據(jù)類型 COM 封送提供一組有限的數(shù)據(jù)類型(由 COM 標(biāo)準(zhǔn)定義的那些類型)。由于 ADO.NET 中的數(shù)據(jù)集傳輸基于 XML 格式,所以對(duì)數(shù)據(jù)類型沒(méi)有限制。因此,共享數(shù)據(jù)集的組件可以使用這些組件一般會(huì)使用的任何豐富的數(shù)據(jù)類型集。
6、性能
傳輸大型 ADO 記錄集或大型 ADO.NET 數(shù)據(jù)集會(huì)使用網(wǎng)絡(luò)資源;隨著數(shù)據(jù)量的增長(zhǎng),施加于網(wǎng)絡(luò)的壓力也在增加。ADO 和 ADO.NET 都使您可以最大限度地降低所傳輸?shù)臄?shù)據(jù)。但
ADO.NET 還提供另一個(gè)性能優(yōu)勢(shì):ADO.NET 不需要數(shù)據(jù)類型轉(zhuǎn)換。而需要 COM 封送來(lái)在組件間傳輸記錄集的 ADO,則需要將 ADO 數(shù)據(jù)類型轉(zhuǎn)換為 COM 數(shù)據(jù)類型。
7、穿透防火墻
防火墻可以影響試圖傳輸不連接的 ADO 記錄集的兩個(gè)組件。請(qǐng)記住,防火墻通常配置為允許 HTML 文本通過(guò),但防止系統(tǒng)級(jí)請(qǐng)求(如 COM 封送)通過(guò)。 因?yàn)榻M件使用 XML 交換 ADO.NET 數(shù)據(jù)庫(kù),所以防火墻可以允許數(shù)據(jù)集通過(guò)。
ASP.Net與ASP相比,主要有哪些進(jìn)步?
asp解釋型,aspx編譯型,性能提高,有利于保護(hù)源碼
ASP的缺點(diǎn):
l VBScript和JavaScript是在ASP中僅可使用的兩種腳本語(yǔ)言。它們是基本的非類型化語(yǔ)言。在ASP中不能使用強(qiáng)類型語(yǔ)言.
l ASP頁(yè)面需要解釋,使得它執(zhí)行速度較慢。
l ASP頁(yè)面非常凌亂。
l 在使用ASP創(chuàng)建WEB應(yīng)用程序時(shí),程序員和設(shè)計(jì)人員必須在同一文件上一起工作。
l 在ASP中,必須通過(guò)編寫(xiě)代碼來(lái)提供所需的任何功能。
l 在ASP中沒(méi)有對(duì)代碼給予太多的關(guān)注。
l 在ASP中沒(méi)有調(diào)試機(jī)制。
l 在ASP中。必須停止WEB服務(wù)器才能安裝DLL的新版本,并且在應(yīng)用程序中使用DLL的新版本之前,必須先在注冊(cè)表中注冊(cè)它,而且,DLL注冊(cè)過(guò)程非常復(fù)雜。
ASP.NET的優(yōu)點(diǎn):
l ASP.Net中支持強(qiáng)類型語(yǔ)言.
l ASP.Net頁(yè)將被編譯而不是解釋,這樣它們的執(zhí)行速度就比ASP頁(yè)快。
l ASP.Net提供聲明性服務(wù)器控件。
l ASP.Net通過(guò)繼承機(jī)制來(lái)支持代碼的重用。
l ASP.Net具有Trace的內(nèi)置方法,可以幫助對(duì)頁(yè)面進(jìn)行調(diào)試。
l 在ASP.Net中,置于應(yīng)用程序的BIN目錄中的任何組件將自動(dòng)對(duì)應(yīng)用程序可用.
你對(duì)XML,HTTP、WEBSERVICE了解嗎?簡(jiǎn)單描述其特點(diǎn)、作用
xmlhttp可以主動(dòng)獲取遠(yuǎn)端web代碼,類似HttpWebRequest
存儲(chǔ)過(guò)程和函數(shù)的區(qū)別
存儲(chǔ)過(guò)程是編譯好的存儲(chǔ)在數(shù)據(jù)庫(kù)的操作,函數(shù)不用說(shuō)了。
Session,ViewState,Application,cookie的區(qū)別?
Session:用于保持狀態(tài)的基于 Web 服務(wù)器的方法。Session 允許通過(guò)將對(duì)象存儲(chǔ)在Web 服務(wù)器的內(nèi)存中在整個(gè)用戶會(huì)話過(guò)程中保持任何對(duì)象。主要用于保持代碼隱藏類中對(duì)象的狀態(tài)。為每個(gè)用戶創(chuàng)建的,用于存儲(chǔ)單個(gè)用戶,因?yàn)樗窍鄬?duì)每個(gè)用戶的.所以可能來(lái)取得在線人數(shù)等。
ViewState:主要用于保持 Web 頁(yè)上控件的狀態(tài)。當(dāng) Web 頁(yè)上的控件被綁定到代碼隱藏類中的對(duì)象。
Application用于存儲(chǔ)所有用戶都可視的信息.所以它存儲(chǔ)的是要讓所有用戶共享的一些信息.如總訪問(wèn)數(shù)等Cache,頁(yè)面緩存。
Cookie:通常我們都把它放在客戶端,也可以存儲(chǔ)在服務(wù)器端。主要用它存儲(chǔ)用戶的個(gè)性設(shè)制,和登陸信息。
請(qǐng)說(shuō)明在.Net中常用的幾種頁(yè)面間傳遞參數(shù)的方法,并說(shuō)出他們的優(yōu)缺點(diǎn)。
1、queryString url參數(shù) 簡(jiǎn)單,顯示于地址欄,長(zhǎng)度有限
優(yōu)點(diǎn):簡(jiǎn)單易用;資源占用比較少。
缺點(diǎn):傳遞數(shù)據(jù)大小有限制,只能傳遞基本類型的數(shù)據(jù),安全性差
2、session(viewstate)
優(yōu)點(diǎn):簡(jiǎn)單,靈活性強(qiáng),能傳遞復(fù)雜的對(duì)象
缺點(diǎn):但易丟失,資源消耗大
3、cookie
優(yōu)點(diǎn):簡(jiǎn)單,
缺點(diǎn):但可能不支持,可能被偽造,大小有限制不能超過(guò)4KB 不恩能夠存儲(chǔ)復(fù)雜對(duì)象
4、this.Server.Transfer,
優(yōu)點(diǎn):URL地址不變,安全性高,靈活性強(qiáng),能傳遞復(fù)雜的對(duì)象
缺點(diǎn):資源消耗大
5、hidden control/viewstate 簡(jiǎn)單,可能被偽造
6、static member。
7、cache
8、application
優(yōu)點(diǎn):全局
缺點(diǎn):資源消耗大
9、DataBase 數(shù)據(jù)庫(kù) 穩(wěn)定,安全,但性能相對(duì)弱
10、xml or other Files
11、XMLHTTP or Hidden iFrame/frame
12、Context.user.identity
我正在做一個(gè)通用提示頁(yè)面,所有頁(yè)面出現(xiàn)問(wèn)題都要,傳遞幾個(gè)變量字符串到同一個(gè)頁(yè)面 hitMsg。aspx變量字符串包括提示語(yǔ)言,即將跳轉(zhuǎn)的頁(yè)面,跳轉(zhuǎn)時(shí)間。在上面的種方案中哪個(gè)更好些?
(1)queryString的毛病是無(wú)法傳遞很長(zhǎng)字符串,比如系統(tǒng)錯(cuò)誤信息往往就一整個(gè)屏幕。
(2)session的毛病是不能過(guò)多使用,容易丟失。
(3)cookie的毛病是依賴客戶端設(shè)置,不可靠。
(4)server.transfer的毛病是接收頁(yè)面要為發(fā)送頁(yè)面準(zhǔn)備好,只能定制專門(mén)一個(gè)頁(yè)面接受定制好的頁(yè)面。不能是一個(gè)頁(yè)面接受任何頁(yè)面。
(5)hidden control/viewstate只能傳遞本頁(yè)。除非特殊制作。
(6)static member。無(wú)法保證線程安全,可能會(huì)此處栽瓜他處得豆。
(7)cache不適合使用一次就扔的變量。
(8)application全局的,開(kāi)銷大。
(9)DataBase全局固化的,開(kāi)銷更大,除非做日志跟蹤。
(10)xml or othe Files全局固化的,開(kāi)銷大,除非做日志跟蹤。
(11)XMLHTTP or Hidden iFrame/frame,做這個(gè)過(guò)于煩瑣。
(12)Context這個(gè)占用了用戶id,不適合做這個(gè)。
如果在一個(gè)B/S結(jié)構(gòu)的系統(tǒng)中需要傳遞變量值,但是又不能使用Session、Cookie、Application,您有幾種方法進(jìn)行處理?
input type="hidden" 簡(jiǎn)單,可能被偽造
url參數(shù) 簡(jiǎn)單,顯示于地址欄,長(zhǎng)度有限
數(shù)據(jù)庫(kù) 穩(wěn)定,安全,但性能相對(duì)弱
this.Server.Transfer,在新頁(yè)面獲得值的代碼如下:
if (Page.PreviousPage != null)
{
TextBox st =
(TextBox)Page.PreviousPage.FindControl("TextBox1");
if (st != null)
{
Label1.Text = SourceTextBox.Text;
}
}
WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語(yǔ)言,不依賴于平臺(tái),可以實(shí)現(xiàn)不同的語(yǔ)言間的相互調(diào)用,通過(guò)Internet進(jìn)行基于Http協(xié)議的網(wǎng)絡(luò)應(yīng)用間的交互。 WebService實(shí)現(xiàn)不同語(yǔ)言間的調(diào)用,是依托于一個(gè)標(biāo)準(zhǔn),webservice是需要遵守WSDL(web服務(wù)定義語(yǔ)言)/SOAP(簡(jiǎn)單請(qǐng)求協(xié)議)規(guī)范的。 WebService=WSDL+SOAP+UDDI(webservice的注冊(cè))Soap是由Soap的part和0個(gè)或多個(gè)附件組成,一般只有part,在part中有Envelope和Body。 Web Service是通過(guò)提供標(biāo)準(zhǔn)的協(xié)議和接口,可以讓不同的程序集成的一種SOA架構(gòu)。
SOAP請(qǐng)求(Simple Object Access Protocol,簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議)是HTTP POST的一個(gè)專用版本,遵循一種特殊的XML消息格式,Content-type設(shè)置為:text/xml ,任何數(shù)據(jù)都可以XML化。 SOAP:簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議。SOAP是一種輕量的,簡(jiǎn)單的,基于XML的協(xié)議,它被設(shè)計(jì)成在web上交換結(jié)構(gòu)化的和固化的信息。SOAP可以和現(xiàn)存的許多因特網(wǎng)協(xié)議和格式結(jié)合使用,包括超文本傳輸協(xié)議(HTTP),簡(jiǎn)單郵件傳輸協(xié)議(SMTP),多用途網(wǎng)際郵件擴(kuò)充協(xié)議(MIME)。它還支持從消息系統(tǒng)到遠(yuǎn)程過(guò)程調(diào)用(RPC)等大量的應(yīng)用程序。
實(shí)現(xiàn)webservice服務(wù),并通過(guò)client調(diào)用服務(wù)端
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>webservice</artifactId>
<groupId>com.et</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>webservice-server</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入Spring Boot Web Services Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<!-- 引入Apache CXF Spring Boot Starter for JAX-WS -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.3.4</version>
</dependency>
</dependencies>
</project>
package com.et.webservice.server.config;
import com.et.webservice.server.service.MyWebService;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* CXF配置類,負(fù)責(zé)初始化CXF相關(guān)組件、發(fā)布Webservice服務(wù)以及配置CXF Servlet。
*/
@Configuration
public class CxfConfig {
/**
* 自動(dòng)注入Spring Bus實(shí)例,它是CXF的核心組件之一,用于管理和配置CXF運(yùn)行時(shí)環(huán)境。
*/
@Autowired
private SpringBus bus;
/**
* 自動(dòng)注入實(shí)現(xiàn)了MyWebService接口的服務(wù)實(shí)現(xiàn)類實(shí)例,該實(shí)例將被發(fā)布為Webservice供外部調(diào)用。
*/
@Autowired
private MyWebService myWebServiceImpl;
/**
* 創(chuàng)建并返回Webservice端點(diǎn)(Endpoint)實(shí)例,用于發(fā)布MyWebService服務(wù)。
* 將服務(wù)實(shí)現(xiàn)類與Spring Bus關(guān)聯(lián),并指定發(fā)布地址為"/1"。
*
* @return Webservice端點(diǎn)實(shí)例
*/
@Bean
public EndpointImpl endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, myWebServiceImpl);
endpoint.publish("/1"); // 發(fā)布地址
return endpoint;
}
/**
* 創(chuàng)建并返回CXF Servlet的ServletRegistrationBean實(shí)例,用于注冊(cè)CXF Servlet到Spring Boot的Servlet容器中。
* 設(shè)置CXF Servlet的映射路徑為"/services/*",表示所有以"/services/"開(kāi)頭的HTTP請(qǐng)求都將由CXF Servlet處理。
*
* @return CXF Servlet的ServletRegistrationBean實(shí)例
*/
@Bean
public ServletRegistrationBean wsServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/services/*");
}
}
package com.et.webservice.server.service;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(
name = "MyWebService",
targetNamespace = "http://liuhaihua.cn/mywebservice"
)
public interface MyWebService {
@WebMethod
String sayHello(String name);
}
package com.et.webservice.server.service;
import org.springframework.stereotype.Service;
import javax.jws.WebService;
@Service
@WebService
public class MyWebServiceImpl implements MyWebService {
@Override
public String sayHello(String name) {
System.err.println("sayHello is called..."); // 只是為了更明顯的輸出,采用err
return "Hello, " + name + "!";
}
}
package com.et.webservice.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>webservice</artifactId>
<groupId>com.et</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>webservice-client</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 測(cè)試依賴配置 -->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.9.1</version>
<type>pom</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
<!-- 主要依賴配置 -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.5</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>jakarta.activation-api</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>jakarta.jws</groupId>
<artifactId>jakarta.jws-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- Apache CXF相關(guān)依賴 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
<version>2.1.0-alpha1</version>
</dependency>
</dependencies>
</project>
package com.et.webservice.client;
import javax.jws.WebService;
@WebService(
name = "MyWebService",
targetNamespace = "http://liuhaihua.cn/mywebservice"
)
public interface HelloService {
// 接口名一樣
String sayHello(String name); // 方法定義名一樣
}
package com.et.webservice.client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
* 客戶端調(diào)用類,用于通過(guò)JAX-WS代理方式訪問(wèn)HelloService Web服務(wù)。
*/
public class Client {
/**
* 程序主入口方法。
*
* @param args 命令行參數(shù)
*/
public static void main(String[] args) {
// 創(chuàng)建JAX-WS代理工廠對(duì)象
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
// 設(shè)置要訪問(wèn)的服務(wù)地址
jaxWsProxyFactoryBean.setAddress("http://localhost:8088/services/1?wsdl");
// 設(shè)置服務(wù)接口類,即HelloService
jaxWsProxyFactoryBean.setServiceClass(HelloService.class);
// 使用工廠對(duì)象創(chuàng)建HelloService接口的代理實(shí)例
HelloService helloService = jaxWsProxyFactoryBean.create(HelloService.class);
System.out.println(helloService.getClass());
// 調(diào)用代理實(shí)例的方法,向服務(wù)端發(fā)送請(qǐng)求,并打印返回結(jié)果
System.out.println(helloService.sayHello("hello world"));
}
}
以上只是一些關(guān)鍵代碼,所有代碼請(qǐng)參見(jiàn)下面代碼倉(cāng)庫(kù)
啟動(dòng)服務(wù)端,訪問(wèn)http://localhost:8088/services/1?wsdl
調(diào)用客戶端,返回結(jié)果
11:20:20.148 [main] DEBUG org.apache.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.ws.policy.PolicyVerificationInInterceptor@1e8823d2
11:20:20.148 [main] DEBUG org.apache.cxf.ws.policy.PolicyVerificationInInterceptor - Verified policies for inbound message.
Hello, hello world!
meter作為性能或自動(dòng)化測(cè)試工具在開(kāi)展工作時(shí),其扮演的角色是模擬用戶操作,而后記錄響應(yīng)結(jié)果并統(tǒng)計(jì)如響應(yīng)時(shí)間、TPS等性能指標(biāo),而實(shí)現(xiàn)請(qǐng)求訪問(wèn)這個(gè)場(chǎng)景就要用到工具中取樣器的相關(guān)功能。
取樣器的主要用來(lái)模擬用戶操作向服務(wù)器發(fā)出各位請(qǐng)求,如webservice或Java請(qǐng)求等,然后根據(jù)請(qǐng)求獲取對(duì)應(yīng)的響應(yīng)信息,同時(shí)配合監(jiān)聽(tīng)器結(jié)果樹(shù)等驗(yàn)證該接口的響應(yīng)是否合理。在Jmeter中取樣器的種類很多,常見(jiàn)的主要有HTTP請(qǐng)求和JDBC reques兩類。
一、HTTP請(qǐng)求
1.首先在測(cè)試計(jì)劃下添加線程組,在線程組中添加取樣器<HTTP請(qǐng)求>,如圖所示:
2.相關(guān)參數(shù)設(shè)置說(shuō)明:
名稱:定義改取樣器請(qǐng)求目標(biāo)的標(biāo)識(shí),可按需設(shè)置。
注釋:按需備注,可為空。
基本:
·協(xié)議:協(xié)議支持“http”和“https”
·服務(wù)器名稱或IP/端口:此處填寫(xiě)請(qǐng)求的目標(biāo)服務(wù)端地址,端口號(hào)默認(rèn)為80。
·http請(qǐng)求方法:常見(jiàn)的有POST和GET,兩者均作為T(mén)CP鏈接并無(wú)本質(zhì)區(qū)別
·路徑:請(qǐng)求資源路徑
·內(nèi)容編碼:如果內(nèi)容含有中文一般為utf-8
·自動(dòng)重定向:針對(duì)GET和HEAD請(qǐng)求如包含重定向則可自動(dòng)跳轉(zhuǎn)目標(biāo)頁(yè)面,但不記錄前置請(qǐng)求,無(wú)法做內(nèi)容關(guān)聯(lián)
·跟蹤重定向:Jmeter默認(rèn)選項(xiàng)可跟蹤定向并將請(qǐng)求返回記錄與結(jié)果樹(shù)中,可對(duì)響應(yīng)進(jìn)行關(guān)聯(lián)。
·使用keepalive:保持http中的請(qǐng)求alive,默認(rèn)勾選
·對(duì)POST使用multipart/form-data、與瀏覽器兼容的頭:當(dāng)方法為post時(shí)默認(rèn)勾選該兩項(xiàng)
高級(jí):
·客戶端實(shí)現(xiàn):選擇http請(qǐng)求方式,常見(jiàn)為HttpClien4和Java。
·超時(shí):連接超時(shí)時(shí)間、響應(yīng)等待超時(shí)時(shí)間
·從HMTL文件嵌入資源:當(dāng)需要獲取響應(yīng)中如圖片、動(dòng)畫(huà)等內(nèi)容時(shí),勾選此項(xiàng)可對(duì)響應(yīng)HTML進(jìn)行解析??梢詫?duì)并行資源進(jìn)行定義,默認(rèn)為6
·源地址:此屬性用于實(shí)現(xiàn)動(dòng)態(tài)IP訪問(wèn),使得Jmeter具有多個(gè)IP地址
·代理服務(wù)器:此屬性用于配置網(wǎng)絡(luò)代理
·其他任務(wù):勾選該項(xiàng)實(shí)現(xiàn)對(duì)響應(yīng)報(bào)文的篩選,既僅保留響應(yīng)數(shù)據(jù)的MD5值,剔除冗余信息
二、JDBC Request
JDBC英文名為Java Data Base Connectivity(Java數(shù)據(jù)庫(kù)連接),它是Java編程語(yǔ)言和各類數(shù)據(jù)庫(kù)之間連接標(biāo)準(zhǔn)的Java API,可以認(rèn)為JDBC規(guī)范了它提供的接口,使得由Java編寫(xiě)的應(yīng)用程序可以便捷訪問(wèn)底層數(shù)據(jù)庫(kù)。但不同的數(shù)據(jù)庫(kù)訪問(wèn)往往需要不同的驅(qū)動(dòng),所以在使用JDBC取樣前要將目標(biāo)數(shù)據(jù)庫(kù)驅(qū)動(dòng)放置在Jmeter的lib目錄下,然后配合JDBC Connection Configuration聯(lián)通數(shù)據(jù)庫(kù)。
1.首先在線程組下添加配置元件->JDBC Connection Configuration:
·Variable Name for created pool: 該變量名與Request中連接池變量名相同
·Max Number of Connections:數(shù)據(jù)庫(kù)連接池的最大連接數(shù)
·Max Wait (ms) :連接超時(shí)限額,超過(guò)返回連接最大等待時(shí)間則報(bào)錯(cuò)
·Time Between Eviction Runs (ms):當(dāng)前連接池保持該時(shí)長(zhǎng)無(wú)交互則關(guān)閉
·Auto Commit :自動(dòng)執(zhí)行SQL語(yǔ)句
·Transaction Isolation:事務(wù)間隔級(jí)別設(shè)置
·Test While Idle:空閑時(shí)判斷連接連接狀態(tài)
·Soft Min Evictable Idle Time(ms):連接池閑置狀態(tài)下保持連接的最小時(shí)長(zhǎng)
·validation query:如超5秒無(wú)請(qǐng)求則調(diào)用該SQL測(cè)試連接有效性
·Database URL:數(shù)據(jù)庫(kù)地址
·JDBC Driver class:選擇lib目錄下存放對(duì)應(yīng)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)
·Username:數(shù)據(jù)庫(kù)用戶
·Password:數(shù)據(jù)庫(kù)密碼
2.然后在該線程組下添加取樣器->JDBC Request:
·Variable name of Pool:數(shù)據(jù)庫(kù)連接池變量名
·Query:填列待執(zhí)行數(shù)據(jù)庫(kù)SQL
·parameter valus:數(shù)據(jù)的參數(shù)值
·parameter types:數(shù)據(jù)的參數(shù)類型
·variable names:SQL返回的變量名,多個(gè)變量以逗號(hào)隔開(kāi)
·result variable name:保存某變量的全部返回結(jié)果(引用${id_n}調(diào)用多行數(shù)據(jù))
·query timeout:查詢超時(shí)時(shí)間
·handle result set:定義如何處理callable statements語(yǔ)句結(jié)果
取樣器作為用來(lái)模擬用戶請(qǐng)求操作和獲取返回影響數(shù)據(jù)的模塊,功能類似于LoadRunner中的Vuser;,以上介紹的兩種請(qǐng)求方式可分別實(shí)現(xiàn)從前端請(qǐng)求訪問(wèn)和直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行壓測(cè),作為自動(dòng)化測(cè)試和性能測(cè)試的前置步驟,HTTP和JDBC使用頻次高較為常見(jiàn),日常測(cè)試中需要熟練掌握。
**推薦一個(gè)「Python自動(dòng)化測(cè)試學(xué)習(xí)交流群」給大家:
請(qǐng)關(guān)注+私信回復(fù):"頭條" 就可以免費(fèi)拿到軟件測(cè)試學(xué)習(xí)資料,同時(shí)進(jìn)入群學(xué)習(xí)交流~~
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。