版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第十一章
網(wǎng)絡編程與Web服務C#.net程序設計1本章主要內(nèi)容WebClient類,WebRequest和WebResponse類實現(xiàn)TCP服務的TCPClient、TCPListener和Socket類創(chuàng)建Web服務,同步和異步調(diào)用Web服務使用SOAP頭身份驗證創(chuàng)建Web服務安全使用Web服務創(chuàng)建多層分布式應用程序網(wǎng)絡編程概述因特網(wǎng)(Internet)又稱互聯(lián)網(wǎng),是目前世界上影響最大的國際性計算機網(wǎng)絡。因特網(wǎng)以TCP/IP網(wǎng)絡協(xié)議將各種不同類型、不同規(guī)模、位于不同地理位置的物理網(wǎng)絡聯(lián)接成一個整體?;ヂ?lián)網(wǎng)Internet提供的主要服務有萬維網(wǎng)(WWW)、文件傳輸(FTP)、電子郵件(E-mail)、遠程登錄(Telnet)等,萬維網(wǎng)WWW,有時也叫Web,是無數(shù)個網(wǎng)絡站點和網(wǎng)頁的集合。WWW是以超文本標注語言HTML與超文本傳輸協(xié)議HTTP為基礎。能夠提供面向Internet服務的、一致的用戶界面的信息瀏覽系統(tǒng)。Internet應用程序大體上分為兩類:客戶端應用程序(請求信息)和服務器應用程序(響應來自客戶端的信息請求)。典型的Internet客戶端-服務器應用程序是萬維網(wǎng)(WWW)。網(wǎng)絡編程網(wǎng)絡編程概述
在萬維網(wǎng)中,人們使用瀏覽器來訪問世界各地的Web服務器上存儲的文檔和其他數(shù)據(jù)。此外中間層應用程序服務器通過請求其他服務器的數(shù)據(jù)來響應客戶端的請求,在這種情況中,它既作為服務器,也作為客戶端。 客戶端應用程序通過標識所請求的Internet資源以及用于該請求和響應的通信協(xié)議來發(fā)出請求??蛻舳诉€提供完成請求所需的任何附加數(shù)據(jù),例如身份驗證信息(用戶名、密碼等)。只要形成了請求,就可以將該請求發(fā)送到服務器。 對于需要建立用于Internet資源的簡單請求的應用程序而言,WebClient類提供用于將數(shù)據(jù)上載到Internet服務器或從Internet服務器下載數(shù)據(jù)的常用方法。WebClient依賴WebRequest類來提供對Internet資源的訪問。 偵聽網(wǎng)絡并發(fā)送請求的應用程序使用TCPClient類、TCPListener類、UDPClient類和Sockets類。網(wǎng)絡編程WebClient類
對于簡單請求和響應事務,WebClient類提供將數(shù)據(jù)上載到Internet服務器或從Internet服務器下載數(shù)據(jù)的最簡便的方法。WebClient提供上載和下載文件、發(fā)送和接收流以及將數(shù)據(jù)緩沖區(qū)發(fā)送到服務器并接收響應的方法。 下面通過WebClientSample項目中的代碼來演示使用WebClient類上載和下載數(shù)據(jù):
staticclassProgram{privatestaticvoidMain(string[]args){stringserverName;NetworkCredentialcredentials= newNetworkCredential("anonymous","");//匿名用戶
serverName=args[0];//第一個命令行參數(shù)是ftp服務器名
DemonstrateWebClient(serverName,credentials);}網(wǎng)絡編程
privatestaticstringReadFileName(stringoperation){Console.Write("輸入"+operation+"相對登錄目錄文件名");returnConsole.ReadLine();}privatestaticstringReadData(){Console.WriteLine("Entersometextdatatoupload:");returnConsole.ReadLine();}privatestaticvoidDemonstrateWebClient(stringserverName,NetworkCredentialcredentials){stringserverAddress="ftp://"+serverName+"/";WebClientwebClient=newWebClient();webClient.Credentials=credentials;//設置發(fā)送主機身份驗證的網(wǎng)絡憑據(jù)
try{//使用webClient.DownloadFile下載ftp文件
stringfileName=ReadFileName("download");stringdownloadAddress=serverAddress+fileName;Console.WriteLine("Downloadingfile"+downloadAddress);webClient.DownloadFile(downloadAddress,fileName);}catch(WebExceptionex){Console.WriteLine(ex.Message);}
using(StreamReadersr=//請求網(wǎng)頁并作為流檢索結(jié)果
newStreamReader(webClient.OpenRead("http://localhost/Htmltest.htm"))){stringstrReponse=sr.ReadToEnd();Console.WriteLine(strReponse);} try{//使用webClient.UploadFile上傳ftp文件
stringfileName=ReadFileName("upload");stringuploadAddress=serverAddress+fileName;Console.WriteLine("Uploadingfile"+uploadAddress);webClient.UploadFile(uploadAddress,fileName);}catch(WebExceptionex){Console.WriteLine(ex.Message);}try//使用webClient.UploadData上傳ftp文件.{stringfileName=ReadFileName("uploadto");stringdata=ReadData();stringuploadAddress=serverAddress+fileName;byte[]byteArray=Encoding.UTF8.GetBytes(data);//string轉(zhuǎn)換為byte[]Console.WriteLine("Uploadingdatato"+uploadAddress);byte[]responseArray=webClient.UploadData(uploadAddress, WebRequestMethods.Ftp.UploadFile,byteArray);
stringresponse;if(responseArray.Length==0)response="<nothing>";elseresponse=Encoding.UTF8.GetString(responseArray);//byte[]轉(zhuǎn)換stringConsole.WriteLine("Responsereceivedwas{0}",response);}catch(WebExceptionex){Console.WriteLine(ex.Message);}webClient.Dispose();}}本例需要在Windows系統(tǒng)中添加ftp服務組件,并在ftp根目錄(如C:\Inetpub\ftproot)下準備一個文件doc1.txt。需要安裝iis,且需要有一個html文件(http://localhost/htmltest.htm)以便下載。這個控制臺程序需要將ftp服務器名稱作為命令行參數(shù),命令行參數(shù)在Main方法中的參數(shù)string[]args被調(diào)用中。設置命令行參數(shù)步驟如下:項目屬性-調(diào)試-命令行參數(shù)處輸入“l(fā)ocalhost”作為服務器名稱。WebRequest和WebResponse請求和發(fā)送數(shù)據(jù)
客戶端應用程序通過將以“http:”、“https:”、“ftp:”等開頭的網(wǎng)絡資源URI傳遞到WebRequest的Create方法來創(chuàng)建WebRequest實例。此靜態(tài)方法創(chuàng)建特定協(xié)議(例如HTTP)的WebRequest。WebRequest的GetResponse方法將返回WebResponse,可用于獲取包含服務器發(fā)回的響應數(shù)據(jù)的流。下面是WebRequestSample項目的代碼:staticvoidgetServerData()//使用WebRequest請求數(shù)據(jù){//通過資源URI調(diào)用Create,創(chuàng)建WebRequest實例。
WebRequestrequest=WebRequest.Create("http://localhost/Htmltest.htm");網(wǎng)絡編程//在WebRequest中設置任何所需的屬性值。如啟用身份驗證
request.Credentials=CredentialCache.DefaultCredentials;WebResponseresponse=request.GetResponse(); //可以訪問WebResponse的屬性
Console.WriteLine((responseasHttpWebResponse).StatusDescription);//要獲取包含服務器發(fā)送的響應數(shù)據(jù)的流
StreamdataStream=response.GetResponseStream();//使用StreamReader打開stream更方便讀數(shù)據(jù)
StreamReaderreader=newStreamReader(dataStream);StringresponseFromServer=reader.ReadToEnd();//讀響應數(shù)據(jù)流內(nèi)容
Console.WriteLine(responseFromServer);//顯示響應數(shù)據(jù)流內(nèi)容
reader.Close();dataStream.Close();response.Close();}
FtpWebRequest和FtpWebResponseFtpWebRequest實現(xiàn)文件傳輸協(xié)議(FTP)客戶端,F(xiàn)tpWebResponse封裝文件傳輸協(xié)議(FTP)服務器對請求的響應。使用WebRequest.Create(downloadUrl)創(chuàng)建FtpWebRequest實例。使用FtpWebRequest實例downloadRequest.GetResponse()創(chuàng)建FtpWebResponse實例。使用FtpWebResponse實例downloadResponse.GetResponseStream();返回響應流stream。使用FtpWebRequest實例的Method屬性設置上傳方法uploadRequest.Method=WebRequestMethods.Ftp.UploadFile;使用uploadRequest.GetRequestStream();返回上傳請求流requestStream,寫入該請求流完成上傳文件。網(wǎng)絡編程下面是FtpSample項目的部分代碼:
staticvoidDownload(stringdownloadUrl){ StreamresponseStream=null; FileStreamfileStream=null; StreamReaderreader=null; try{ FtpWebRequestdownloadRequest =(FtpWebRequest)WebRequest.Create(downloadUrl); FtpWebResponsedownloadResponse =(FtpWebResponse)downloadRequest.GetResponse(); responseStream=downloadResponse.GetResponseStream(); stringfileName=//取下載文件名 Path.GetFileName(downloadRequest.RequestUri.AbsolutePath); if(fileName.Length==0){ reader=newStreamReader(responseStream); Console.WriteLine(reader.ReadToEnd()); } else{ fileStream=File.Create(fileName); byte[]buffer=newbyte[1024]; intbytesRead;
while(true){ bytesRead=responseStream.Read(buffer,0,buffer.Length); if(bytesRead==0) break; fileStream.Write(buffer,0,bytesRead); } } Console.WriteLine("下載完成"); }}staticvoidUpload(stringfileName,stringuploadUrl){ StreamrequestStream=null; FileStreamfileStream=null; FtpWebResponseuploadResponse=null; try{ FtpWebRequestuploadRequest =(FtpWebRequest)WebRequest.Create(uploadUrl); uploadRequest.Method=WebRequestMethods.Ftp.UploadFile; uploadRequest.Proxy=null; requestStream=uploadRequest.GetRequestStream(); fileStream=File.Open(fileName,FileMode.Open); byte[]buffer=newbyte[1024];
intbytesRead; while(true){ bytesRead=fileStream.Read(buffer,0,buffer.Length); if(bytesRead==0)break; requestStream.Write(buffer,0,bytesRead); } requestStream.Close(); uploadResponse =(FtpWebResponse)uploadRequest.GetResponse();} }} 運行測試首先測試下載,在本機ftp服務器存放文件ftp://localhost/dir1/doc2.txt,然后設置項目屬性的命令行參數(shù)為“ftp://localhost/dir1/doc2.txt”,按F5運行程序后查看項目目錄bin\debug下是否存在下載的doc1.txt文件。測試上傳,在FtpSample項目bin\debug下存放上傳文件up1.txt,然后設置項目屬性的命令行參數(shù)為“up1.txtftp://localhost/dir1/doc2.txt,按F5運行程序后查看是否存在ftp://localhost/dir1/doc2.txt文件TCP服務 應用程序可以通過TCPClient、TCPListener和UDPClient類使用傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)文報協(xié)議(UDP)服務。這些協(xié)議類建立在System.Net.Sockets.Socket類的基礎之上,負責數(shù)據(jù)傳送的細節(jié)。TCP協(xié)議建立與遠程終結(jié)點的連接,然后使用此連接發(fā)送和接收數(shù)據(jù)包。TCP負責確保將數(shù)據(jù)包發(fā)送到終結(jié)點并在數(shù)據(jù)包到達時以正確的順序?qū)ζ溥M行組合。要建立TCP連接,必須知道承載所需服務的網(wǎng)絡設備的地址以及該服務用于通信的TCP端口。TcpClient和TcpListener使用NetworkStream類表示用于網(wǎng)絡訪問的基礎數(shù)據(jù)流。使用GetStream方法返回網(wǎng)絡流,然后調(diào)用該流的Read和Write方法進行讀寫。網(wǎng)絡編程 下面是使用TCP協(xié)議完成兩個計算機通訊的例子,在一臺計算機創(chuàng)建TcpServer項目使用TcpListener類作為服務端,在另一臺計算機創(chuàng)建TcpClient項目使用TcpClient類作為客戶端,在兩臺計算機同時運行程序,服務端程序偵聽,客戶端程序請求,服務端程序接收客戶端請求,然后將應答送回客戶端。為了方便,可將兩個程序在同一計算機運行。項目TcpServer的MyTcpListener.csclassMyTcpListener{publicstaticvoidMain(){//用IP地址和端口初始化服務器和監(jiān)聽器,通過實例化類IPAddress和TcpListener來實現(xiàn)。
TcpListenerserver=null;try{//TcpListener創(chuàng)建服務器以監(jiān)視TCP端口13000.Int32port=13000;IPAddresslocalAddr=IPAddress.Parse("");//本機IP地址
server=newTcpListener(localAddr,port);//使用服務器地址和TCP端口
server.Start();//開始偵聽客戶端連接請求
Byte[]bytes=newByte[256];//用于讀數(shù)據(jù)的緩沖字符數(shù)組
Stringdata=null;while(true){//循環(huán)偵聽
Console.Write("等待連接...");//AcceptTcpClient方法接受傳入連接請求并創(chuàng)建TcpClient以處理請求
TcpClientclient=server.AcceptTcpClient();//連接上才返回TcpClientConsole.WriteLine("已連接!");
data=null;//使用GetStream方法返回NetworkStream,然后調(diào)用該流Read和WriteNetworkStreamstream=client.GetStream();inti;//循環(huán)接收該連接的Tcp客戶端送的所有數(shù)據(jù)
while((i=stream.Read(bytes,0,bytes.Length))!=0){//轉(zhuǎn)換接收的字節(jié)數(shù)組成一個ASCII字符串
data=System.Text.Encoding.ASCII.GetString(bytes,0,i);Console.WriteLine("Received:{0}",data);data=data.ToUpper();byte[]msg=System.Text.Encoding.ASCII.GetBytes(data);stream.Write(msg,0,msg.Length);//向客戶端回送字節(jié)數(shù)組數(shù)據(jù)
Console.WriteLine("Sent:{0}",data);}client.Close();//關(guān)閉和結(jié)束該連接
}}catch(SocketExceptione){Console.WriteLine("SocketException:{0}",e);}finally//而Stop方法停止端口上的偵聽.{server.Stop();}}}項目TcpClient作為TCP客戶端程序,MyTcpClient.cs主要代碼如下:classMyTcpClient{staticvoidMain(string[]args){Connect("localhost","hello");}//服務端是本機localhsot,用IP地址和端口
staticvoidConnect(Stringserver,Stringmessage){try{//用IP地址和端口初始化TCP客戶端用TcpClient來實現(xiàn)。
Int32port=13000;TcpClientclient=newTcpClient(server,port);//服務端是本機localhsot//轉(zhuǎn)換一個ASCII字符串成字節(jié)數(shù)組
Byte[]data=System.Text.Encoding.ASCII.GetBytes(message);//使用GetStream方法返回NetworkStream,然后調(diào)用該流的Read和WriteNetworkStreamstream=client.GetStream();stream.Write(data,0,data.Length);//向所連接的TCP服務器發(fā)送字節(jié)數(shù)組數(shù)據(jù)
Console.WriteLine("Sent:{0}",message);data=newByte[256];StringresponseData=String.Empty;//讀所連接的TCP的服務器發(fā)回的第一批字節(jié)數(shù)組數(shù)據(jù)
Int32bytes=stream.Read(data,0,data.Length);responseData=System.Text.Encoding.ASCII.GetString(data,0,bytes);Console.WriteLine("Received:{0}",responseData);stream.Close();client.Close();////關(guān)閉流,關(guān)閉和結(jié)束連接
}catch(SocketExceptione){Console.WriteLine("SocketException:{0}",e);}}}Socket類應用程序通過TCPClient和TCPListener使用傳輸控制協(xié)議(TCP),這些協(xié)議類建立在System.Net.Sockets.Socket類的基礎之上,負責數(shù)據(jù)傳送的細節(jié)。TCP協(xié)議類TCPClient、TCPListener使用Socket類的同步方法提供對網(wǎng)絡服務的簡單直接的訪問,沒有維護狀態(tài)信息的系統(tǒng)開銷,也不需要了解協(xié)議特定的套接字的設置細節(jié)。要使用異步Socket方法,可以使用NetworkStream類提供的異步方法。要訪問不是由TCPClient和TCPListener公開的Socket類的功能,必須使用Socket類。Socket類可用于比TCPClient、TCPListener更復雜的編程。網(wǎng)絡編程WebBrowser控件
WebBrowser控件包含多種可以用來實現(xiàn)InternetExplorer中的控件的屬性、方法和事件。例如,可以使用Navigate方法實現(xiàn)地址欄,使用GoBack、GoForward、Stop和Refresh方法實現(xiàn)工具欄中的導航按鈕??梢蕴幚鞱avigated事件,以便使用Url屬性的值更新地址欄,使用DocumentTitle屬性的值更新標題欄。網(wǎng)絡編程Web服務概述Web服務是一個應用程序,它向外界暴露出一個能夠通過Web進行調(diào)用的API。這就是說,能夠用編程的方法通過Web來調(diào)用這個應用程序。Web服務三個基本技術(shù)Web服務通過標準通信協(xié)議,在互聯(lián)網(wǎng)上發(fā)布有用的程序模塊(以服務的方式),目前大部分是用SOAP簡單對象訪問協(xié)議來作通信協(xié)議。Web服務提供一份詳細的接口說明書,來幫助用戶構(gòu)建應用程序,這個接口說明書叫作WSDL。通常已發(fā)布的Web服務要注冊到管理服務器,這樣便于使用者查詢和使用。這個是通過UDDI來完成的。Web服務泛型概述SOAP(簡單對象訪問協(xié)議)是這樣的一個開放協(xié)議:SOAP=RPC+HTTP+XML,采用HTTP作為底層通訊協(xié)議;RPC遠程過程調(diào)用作為一致性的調(diào)用途徑,XML作為數(shù)據(jù)傳送的格式,允許服務提供者和服務客戶經(jīng)過防火墻在INTERNET進行通訊交互。
Web服務最主要的優(yōu)點是,使用不同程序包括在不同系統(tǒng)平臺上開發(fā)出來的程序,都可以相互通信。Web服務既可以在內(nèi)部由單個應用程序使用,也可通過Internet供任意數(shù)量的應用程序使用。Web服務正在開創(chuàng)一個分布式應用程序開發(fā)的新時代。Web服務ASP.NET創(chuàng)建Web服務在VisualWebDeveloper(VS2005)“文件”菜單上單擊“新建網(wǎng)站”?!靶陆ňW(wǎng)站”對話框隨即出現(xiàn)。在“VisualStudio已安裝的模板”之下單擊“ASP.NETWeb服務”。單擊“瀏覽”。單擊“本地IIS”。單擊“默認網(wǎng)站”。單擊“創(chuàng)建新Web應用程序”按鈕。VisualWebDeveloper創(chuàng)建一個新的IISWeb應用程序。鍵入名稱TemperatureWebService。單擊“打開”。出現(xiàn)“新建網(wǎng)站”對話框,如下圖所示。新網(wǎng)站的名稱位于最右邊的“位置”列表中。該位置包括協(xié)議(“http://”)和位置(“l(fā)ocalhost”)。這指示正在處理本地IIS網(wǎng)站。在“語言”列表中,單擊VisualC#。單擊“確定”。VisualWebDeveloper創(chuàng)建新的Web服務并打開一個名為Service的新類,該類為默認Web服務。在解決方案資源管理器中,右擊(http://localhost/TemperatureWebService),然后單擊“添加新項”。在“VisualStudio已安裝的模板”之下單擊“Web服務”,然后在“名稱”框中鍵入“Convert.asmx”,如下圖所示。確?!皩⒋a放在單獨的文件中”復選框已選定,然后單擊“添加”。創(chuàng)建一個新的Web服務,它由兩個文件組成:Convert.asmx和該文件所指向Web服務代碼App_Code文件夾中的Convert.cs類文件。Convert.asmx文件內(nèi)容如下:<%@WebServiceLanguage="C#"CodeBehind="~/App_Code/Convert.cs"Class="Convert"%>在Web服務中創(chuàng)建兩種方法。第一種方法將華氏溫度轉(zhuǎn)換為攝氏溫度,第二種方法將攝氏溫度轉(zhuǎn)換為華氏溫度。在Convert.cs的Convert類中添加下面的代碼,并保存該文件。[System.Web.Services.WebMethod()]publicdoubleFahrenheitToCelsius(doubleFahrenheit){return((Fahrenheit-32)*5)/9;}[System.Web.Services.WebMethod()]publicdoubleCelsiusToFahrenheit(doubleCelsius){return((Celsius*9)/5)+32;}在方法名前放置一個屬性[System.Web.Services.WebMethod()]作為方法聲明的一部分,表明該方法是Web服務對外公開的一個方法。測試Web服務在解決方案資源管理器中,單擊Convert.asmx,然后按Ctrl+F5。調(diào)用Web服務,在資源管理器中顯示一個頁,顯示由Web服務公開的方法,如下圖所示:單擊“CelsiusToFahrenheit”,它調(diào)用該方法。出現(xiàn)一頁,提示輸入CelsiusToFahrenheit方法的參數(shù)值。在“Celsius”框中,如下圖所示,鍵入“100”,然后單擊“調(diào)用”。出現(xiàn)一個新窗口,顯示調(diào)用CelsiusToFahrenheit方法時Web服務返回的值“212”結(jié)果。關(guān)閉包含方法結(jié)果的瀏覽器。在原始瀏覽器中,單擊“后退”以返回到方法列表。創(chuàng)建一個Windows應用程序調(diào)用Web服務創(chuàng)建一個名為temperature的Windows的應用程序項目。將Form1窗體,按下圖設計程序界面。向Form1窗體添加三個Label,一個TextBox,一個Button控件,并按下表設置它們的屬性??丶Q屬性屬性值labellabellabelTextName,TextName,Text“需要轉(zhuǎn)換的溫度:”“l(fā)blFarenheit”,“華氏溫度轉(zhuǎn)換為攝氏溫度”“l(fā)blCelsius”,“攝氏溫度轉(zhuǎn)換為華氏溫度”TextBoxname“txtTemperature”ButtonName,Text“btnConvert”,"轉(zhuǎn)換"創(chuàng)建對Web服務的引用在解決方案資源管理器中,右擊本項目的名稱,然后單擊“添加Web引用”?!疤砑覹eb引用”對話框隨即出現(xiàn)。在“URL”列表中,為Web服務輸入下面的URL,然后單擊“前往”(“執(zhí)行”):http://localhost/TemperatureWebService/Convert.asmx找到Web服務后,在“添加Web引用”對話框中出現(xiàn)有關(guān)Web服務的信息。單擊一個方法鏈接。出現(xiàn)該方法的測試頁。單擊“添加引用”。在引用目錄下創(chuàng)建一個WebReferences文件夾,默認情況下,給Web引用分配一個與其服務器名稱對應的命名空間(這里為localhost),所添加一個Web服務屬于該命名空間。添加“轉(zhuǎn)換”按鈕事件處理程序 雙擊“轉(zhuǎn)換”按鈕,為其Click事件創(chuàng)建事件處理程序,代碼如下:privatevoidbtnConvert_Click(objectsender,EventArgse){//創(chuàng)建Web服務http://localhost/TemperatureWebService/Convert.asmx的代理wsConvert localhost.ConvertwsConvert=newlocalhost.Convert(); doubletemperature= System.Convert.ToDouble(txtTemperature.Text); //通過Web服務代理wsConvert調(diào)用Web服務的方法//FahrenheitToCelsius lblFarenheit.Text="華氏溫度轉(zhuǎn)換為攝氏溫度="+ wsConvert.FahrenheitToCelsius(temperature).ToString("f2"); lblCelsius.Text="攝氏溫度轉(zhuǎn)換為華氏溫度="+ wsConvert.CelsiusToFahrenheit(temperature).ToString("f2");}事件驅(qū)動異步調(diào)用Web服務Web服務支持客戶端與提供Web服務的服務器之間的同步和異步通信。在同步通信情況下,客戶端向服務主機服務器發(fā)送服務請求并等待響應。這會阻止客戶端在等待結(jié)果時執(zhí)行其他操作。而異步通信讓客戶端在等待響應時繼續(xù)處理其他任務。使用異步通信提高了系統(tǒng)利用率,避免當客戶端等待Web服務結(jié)果時在客戶端上造成延遲。Web服務方法進行異步通信有兩種機制。第一種機制是Begin/End模式。第二種機制是在.NET框架2.0版中提供的事件驅(qū)動的異步編程模式。Web服務支持新的基于事件的異步模式進行多線程編程。相對于Begin/End模式來說,事件驅(qū)動的異步調(diào)用Web服務編程模式,更簡潔,可以迅速開發(fā)出高性能的基于Web服務的應用程序。Web服務例:實現(xiàn)事件驅(qū)動異步調(diào)用Web服務,步驟如下:創(chuàng)建一個Web服務http://localhost/helloworldwaitservice/HelloWorldWaitService.asmx包含如下耗時的同步Web方法:[Web服務(Namespace="/")]publicclassHelloWorldWaitService{[WebMethod]publicstringHelloWorld(){Thread.Sleep(3000);//睡眠3秒
return"你好!歡迎學習C#.net";} }創(chuàng)建一個Windows應用程序?qū)崿F(xiàn)事件驅(qū)動異步調(diào)用Web服務HelloWorldWaitService創(chuàng)建一個名為AsynWebService的Windows的應用程序項目。將Form1窗體,按下圖設計程序界面。向Form1窗體添加一個TextBox,兩個Button控件,并按下表設置它們的屬性??丶Q屬性屬性值TextBoxName“txtOutput”ButtonName,Text“btnSyn”,"同步調(diào)用Web服務"ButtonName,Text“btnAsyn”,"異步調(diào)用Web服務"在AsynWebService項目中,將下面Web服務添加為Web引用:http://localhost/helloworldwaitservice/HelloWorldWaitService.asmx在Form1.cs第一行添加usingAsynWebService.localhost;這是Web服務代理所在的命名空間,使用using語句方便調(diào)用Web服務HelloWorldWaitService。雙擊“同步調(diào)用Web服務”按鈕,為其Click事件創(chuàng)建如下處理程序,該處理程序?qū)⒄{(diào)用Web服務HelloWorldWaitService的HelloWorld方法,這些方法是同步調(diào)用,程序堵塞直到HelloWorld方法完成后才返回。
添加Web服務異步事件處理方法,在Web服務方法返回時將調(diào)用該方法,該方法必須按照publicvoidMethodName(objectsender,AsyncCompletedEventArgsargs)簽名格式,然后將該異步事件處理方法添加到Web服務代理的Completed事件。下面所添加的HelloWorldCompleted方法。publicvoidHelloWorldCompleted(objectsender,AsyncCompletedEventArgsargs){//該方法將分配給Web服務代理service的Completed事件
StringwhichCall=(String)args.UserState;/*args.UserState是調(diào) 用異步方法的參數(shù),如異步調(diào)用Web服務方法 service.HelloWorldAsync("firstcall");中"firstcall"*/ if(whichCall.Equals(“secondcall”)){//如果是第二次異步調(diào)用 DateTimeendTime=DateTime.Now; TimeSpantimeFromStartToEnd=endTime-startTime;//異步調(diào)用Web服務總時間
txtOutput.Text="異步調(diào)用Web服務總時間(秒):"+ timeFromStartToEnd.TotalSeconds;}}雙擊“異步調(diào)用Web服務”按鈕,為其Click事件創(chuàng)建如下處理程序。privatevoidbtnAsyn_Click(objectsender,EventArgse){ HelloWorldWaitServiceservice=newHelloWorldWaitService(); //將事件處理程序分配給Web服務代理service的Completed事件
service.HelloWorldCompleted+=this.HelloWorldCompleted; startTime=DateTime.Now; service.HelloWorldAsync("firstcall");//第一次異步調(diào)用Web服務(馬上返回) service.HelloWorldAsync("secondcall");//第二次異步調(diào)用Web服務(馬上返回)}按F5運行程序,執(zhí)行同步調(diào)用Web服務比異步調(diào)用Web服務耗費雙倍時間。SOAP頭身份驗證Web服務安全 創(chuàng)建Web服務安全,使用ASP.NET創(chuàng)建的Web服務可以選擇兩種安全模式:ASP.NET提供的身份驗證和授權(quán),ASP.NET與Internet信息服務(IIS)組合使用,可以提供多個身份驗證和授權(quán)選項。使用自定義的基于SOAP頭身份驗證。例:使用SOAP頭執(zhí)行身份驗證 本例演示如何使用ASP.NET的Web服務對SOAP標頭的支持。該示例使用一個授權(quán)標頭,該標頭與含有用戶名/密碼信息的請求一起發(fā)送。第一次調(diào)用WebMethod時未包括SOAP標頭,因此失敗。第二次調(diào)用WebMethod時包括SOAP標頭,因此成功返回。
本示例用戶名/密碼信息是以純文本形式發(fā)送的,在實際應用程序中應該添加加密算法。干物女干物女Web服務創(chuàng)建Web服務http://localhsot/HeaderService/HeaderService.asmx,HeaderService..cs中輸入以下代碼,以及定義相應AuthenticateUser方法。publicclassAuthHeader:SoapHeader{publicstringUsername;publicstringPassword;}[Web服務(Namespace="/")]publicclassHeaderService{publicAuthHeadersHeader;[WebMethod(Description="需要由調(diào)用者自定義的SoapHeader)][SoapHeader("sHeader")]//必須添加該屬性,方法中才有SoapHeader類型sHeaderpublicstringSecureMethod(){//如果調(diào)用者無SoapHeader,返回錯誤消息
if(sHeader==null)return"錯誤,請?zhí)峁㏒oapHeader";stringusr=sHeader.Username;stringpwd=sHeader.Password;if(AuthenticateUser(usr,pwd)){return"登錄成功:"+usr;} else{return"ERROR:Couldnotauthenticate";} } privateboolAuthenticateUser(stringusr,stringpwd){ if((usr!=null)&&(pwd!=null)){returntrue; } returnfalse;}}創(chuàng)建一個新的Windows應用程序SoapHeadWebService,添加以上的Web服務引用(本地默認localhost)http://localhsot/HeaderService/HeaderService.asmx。在Form1中添加如下圖所示控件,添加一個Label,兩個Button控件,并按下表設置它們的屬性??丶Q屬性屬性值LabelName,Text“l(fā)blResult”ButtonName,Text“btnSoapHeader”,"SoapHeader認證調(diào)用"ButtonName,Text“btnNoSoapHeader”,"無SoapHeader調(diào)用"雙擊“無SoapHeader調(diào)用”按鈕,為其Click事件創(chuàng)建如下處理程序。usingSoapHeadWebService.localhost;//此句放在在程序第一行privatevoidbtnNoSoapHeader_Click(objectsender,EventArgse){ HeaderServiceh=newHeaderService(); //獲取應用程序的系統(tǒng)憑據(jù)
h.Credentials=System.Net.CredentialCache.DefaultCredentials; lblResult.Text=h.SecureMethod();//使用系統(tǒng)憑據(jù)調(diào)用Web服務,將返回錯誤信息}雙擊“SoapHeader認證調(diào)用”按鈕,為其Click事件創(chuàng)建如下處理程序。privatevoidbtnSoapHeader_Click(objectsender,EventArgse){ HeaderServiceh=newHeaderService(); AuthHeadermyHeader=newAuthHeader();//創(chuàng)建自定義的SoapHeader myHeader.Username="用戶A"; myHeader.Password="password"; h.AuthHeaderValue=myHeader; lblResult.Text=h.SecureMethod();//使用SoapHeader調(diào)用Web服務,將返回正確信息}按Ctrl+F5運行該程序即可測試使用標頭驗證用戶名/密碼信息。Web服務創(chuàng)建分布式應用程序在本例,將創(chuàng)建一個多層的分布式應用程序,此應用程序由三個邏輯層組成:數(shù)據(jù)層、業(yè)務對象層和用戶界面層。數(shù)據(jù)層是SQLServer中的一個數(shù)據(jù)庫。業(yè)務對象層處理如何訪問數(shù)據(jù)以及如何將數(shù)據(jù)分發(fā)到客戶端。用戶界面層由Windows應用程序組成。生成一個Windows客戶端以顯示SQLServerNorthwind示例數(shù)據(jù)庫中的Customers表,創(chuàng)建一個Web服務作為業(yè)務對象層以檢索數(shù)據(jù)庫中包含的Customers信息。應用程序具有簡單的數(shù)據(jù)查找和編輯功能。在同一個服務器上創(chuàng)建Web服務和客戶端應用程序,這種項目結(jié)構(gòu)使得可以使用Windows身份驗證來訪問數(shù)據(jù)庫和測試應用程序。開發(fā)分布式應用程序可能是一次創(chuàng)建一層,從數(shù)據(jù)層開始,然后間層業(yè)務規(guī)則對象,最后創(chuàng)建用戶界面層。在本例中,數(shù)據(jù)層用Northwind數(shù)據(jù)庫。因此,本例將從創(chuàng)建業(yè)務對象Web服務開始,然后生成用戶界面。Web服務 創(chuàng)建中間層業(yè)務對象: 創(chuàng)建Web服務將公開兩個方法。一個方法GetCustomers將從數(shù)據(jù)庫返回數(shù)據(jù)集。其次是UpdateCustomers,將數(shù)據(jù)集的更改保存回數(shù)據(jù)庫。步驟如下:創(chuàng)建ASP.NETWeb服務項目“http://localhost/CustomersService”并添加Web服務CustomersService.asmx。創(chuàng)建一個類型化數(shù)據(jù)集DsCustomers,使用MSSQLServer的Northwind數(shù)據(jù)庫,SQL語句“SELECT*FROMCustomers”和“使用Windows身份驗證方式”,其他的使用默認選項。配置該Web服務為集成Windows身份驗證,關(guān)閉匿名訪問并打開模擬。從“控制面板”的“管理工具”中啟動“Internet信息服務”工具。展開服務器的節(jié)點。展開“默認網(wǎng)站”節(jié)點。右擊“CustomersService服務”的節(jié)點并從快捷菜單中選擇“屬性”。單擊“目錄安全性”選項卡。在“匿名訪問和身份驗證控制”節(jié)中單擊“編輯”按鈕。清除“匿名訪問”復選框。選擇“
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公共安全視頻監(jiān)控管理指南(標準版)
- 互聯(lián)網(wǎng)金融服務管理辦法
- 檔案資料管理規(guī)范制度
- 房地產(chǎn)租賃合同簽訂與管理規(guī)范(標準版)
- 2025年企業(yè)財務管理與核算規(guī)范
- 超市消防安全教育制度
- 采購信息網(wǎng)絡安全與保密制度
- 辦公室員工績效評估制度
- 上師大附中嘉定新城分校2026學年教師招聘與實習生招募備考題庫(第二批次)及完整答案詳解一套
- 養(yǎng)老院安全防護制度
- 220KV和110KV變壓器中性點過電壓保護技術(shù)規(guī)范
- 排矸協(xié)議合同范本3篇
- 2025-2030年中國油砂開發(fā)行業(yè)運行前景分析及發(fā)展戰(zhàn)略研究報告
- 2024-2025學年江蘇省蘇州吳中、吳江、相城、高新區(qū)初一(上)語文期末試題及答案
- 幫人炒股委托協(xié)議書
- 咨詢服務風險管理-洞察闡釋
- 霍尼韋爾Honeywell PKS系統(tǒng)維護手冊
- 航天智能通信原理與應用 課件 第7章 電磁頻譜感知
- 鉬靶室管理制度
- 市政工程預防高處墜落方案
- 護理節(jié)前安全教育
評論
0/150
提交評論