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