成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用C#創(chuàng)建Web Service

開發(fā) 后端
向大家介紹Web Service的一些基本知識(shí)、如何用C#建立一個(gè)Web Service。通過文章,我們還將對(duì)WSDL、UDDI以及未來的Web Service有一個(gè)大致的了解

微軟在其.NET戰(zhàn)略中,對(duì)其主推的Web Service做了大肆的宣揚(yáng)。現(xiàn)在,Web Service正如火如荼地發(fā)展著,相關(guān)的各項(xiàng)新技術(shù)層出不窮。Web Service的發(fā)展正構(gòu)筑著互聯(lián)網(wǎng)時(shí)代美好的明天。在本文中,我將向大家介紹Web Service的一些基本知識(shí)、如何用C#創(chuàng)建Web Service。通過文章,我們還將對(duì)WSDL、UDDI以及未來的Web Service有一個(gè)大致的了解。

為什么需要Web Service?

以前,分布式的應(yīng)用程序邏輯需要使用分布式的對(duì)象模型,通過使用DCOM、CORBA、RMI之類的基本結(jié)構(gòu),開發(fā)人員仍可擁有使用本地模型所提供的豐富資源和精確性,并可將服務(wù)置于遠(yuǎn)程系統(tǒng)中。

當(dāng)已經(jīng)有中意的中間件平臺(tái)(RMI、Jini、CORBA、DCOM 等等)時(shí),我們?yōu)槭裁催€要為Web而煩惱呢?中間件確實(shí)提供了強(qiáng)大的服務(wù)實(shí)現(xiàn)手段,但是,這些系統(tǒng)有一個(gè)共同的缺陷,那就是它們無法擴(kuò)展到互聯(lián)網(wǎng)上:它們要求服務(wù)客戶端與系統(tǒng)提供的服務(wù)本身之間必須進(jìn)行緊密耦合,即要求一個(gè)同類基本結(jié)構(gòu)。然而這樣的系統(tǒng)往往十分脆弱:如果一端的執(zhí)行機(jī)制發(fā)生變化,那么另一端便會(huì)崩潰。例如,如果服務(wù)器應(yīng)用程序的接口發(fā)生更改,那么客戶端便會(huì)崩潰。為了能擴(kuò)展到互聯(lián)網(wǎng)運(yùn)用,我們需要一種松散偶合的基本結(jié)構(gòu)來解決這個(gè)問題。如此的情況下就迎來了Web Service的誕生。

什么是Web Service?

Web Service 是一種新的Web應(yīng)用程序分支,他們是自包含、自描述、模塊化的應(yīng)用,可以發(fā)布、定位、通過Web調(diào)用。Web Service可以執(zhí)行從簡單的請(qǐng)求到復(fù)雜商務(wù)處理的任何功能。一旦部署以后,其他Web Service應(yīng)用程序可以發(fā)現(xiàn)并調(diào)用它部署的服務(wù)。

Web Service是一種應(yīng)用程序,它運(yùn)用了Web網(wǎng)絡(luò)技術(shù)和基于組件開發(fā)的精華成分。可以使用標(biāo)準(zhǔn)的互聯(lián)網(wǎng)協(xié)議,像超文本傳輸協(xié)議(HTTP)和XML,將功能綱領(lǐng)性地體現(xiàn)在互聯(lián)網(wǎng)和企業(yè)內(nèi)部網(wǎng)上。像DCOM、RMI、IIOP等基于組件的對(duì)象模型已經(jīng)流行了較長一段時(shí)間了。然而這些模型都是依賴于一個(gè)特定的對(duì)象模型協(xié)議。Web Service擴(kuò)展了這些模型,使之可以和簡單對(duì)象訪問協(xié)議(Simple Object Access Protocol,SOAP)以及XML通信以根除特定對(duì)象模型協(xié)議帶來的障礙。可將WebService視作Web上的組件編程。(參見如圖1)

公司代號(hào)(數(shù)據(jù)類型:string)
公司全名(數(shù)據(jù)類型:string)
股票價(jià)格(數(shù)據(jù)類型:double)

我們需要將單個(gè)股票報(bào)價(jià)的數(shù)據(jù)信息分解開。可以有很多方法完成此項(xiàng)工作,我們這里用了***的枚舉數(shù)據(jù)類型。我們?cè)贑#中用了“structs”,和C++中的structs一樣。在本文中我們使用C#創(chuàng)建Web Service來實(shí)現(xiàn)。

Web Service基本上是利用超文本傳送協(xié)議(HTTP)和SOAP來使商業(yè)數(shù)據(jù)可以在網(wǎng)上獲得。它將商業(yè)對(duì)象(COM對(duì)象、Java Beans等)顯露給在HTTP上的SOAP調(diào)用并執(zhí)行遠(yuǎn)程功能調(diào)用。因此,Web Service的使用者可以在遠(yuǎn)程對(duì)象上通過SOAP和HTTP在Web上進(jìn)行方法調(diào)用。

圖1

SOAP調(diào)用是一類能引起在位置B上的Web Service組件程序執(zhí)行的調(diào)用。之后,程序執(zhí)行的結(jié)果就以XML文檔的形式返回給在位置A上的用戶。

在圖1中,在位置A的用戶怎么知道在位置B的用戶的一些情況的呢?這個(gè)就要涉及到一個(gè)通用標(biāo)準(zhǔn)。服務(wù)描述語言(Service Description Language, SDL),SOAP契約語言(SOAP Contract Language,SCL)以及網(wǎng)絡(luò)可訪問性規(guī)格語言(Network Accessible Specification Language,NASSL)都是為了這個(gè)目的而建立的XML類語言。然而,IBM和微軟最近同意將Web服務(wù)描述語言(Web Service Description Language,WSDL)作為Web Service的標(biāo)準(zhǔn)。

Web Service組件的結(jié)構(gòu)是通過Web服務(wù)描述語言來顯露的。

面臨的任務(wù)

學(xué)會(huì)Web Service的***方法就是自己動(dòng)手做一個(gè)實(shí)例。我們都熟悉股票報(bào)價(jià)服務(wù),納斯達(dá)克、道瓊斯都是很著名的例子。它們都提供一個(gè)輸入公司代號(hào)并取得***的股票價(jià)格的接口。本文我們就設(shè)法設(shè)計(jì)出同樣的功能。

#p#

C#創(chuàng)建Web Service的工具

本文我們通過MS.Net Framework SDK來實(shí)現(xiàn)這個(gè)程序。

創(chuàng)建Web Service的比較好的集成開發(fā)環(huán)境(IDE)是Visual Studio.Net。然而,你也可以很容易的用任何文本編輯器(記事本、寫字板、Visual Studio 6.0)來創(chuàng)建一個(gè)Web Service文件。

還有,你必須熟悉以下概念:

Net平臺(tái)的基礎(chǔ)知識(shí)

C#的基礎(chǔ)知識(shí)

面向?qū)ο蟾拍畹幕A(chǔ)知識(shí)

C#創(chuàng)建Web Service

下面,我們將用C#建立一個(gè)名為“SecurityWebService”的Web Service。一個(gè)Web Service文件將含有形式為.asmx的擴(kuò)展名。(就像Asp.net的文件擴(kuò)展名為.aspx)

  1. 〈%@ WebService Language="C#"   
  2. class="SecurityWebService" % 〉 

這條語句將告訴編譯器程序?qū)⑦\(yùn)行在Web Service模式下以及C#類的名稱。同時(shí)我們要訪問Web Service的名字空間。還有,***添加一個(gè)對(duì)System名字空間的引用。

  1. using System;using System.Web.Services;  
  2. 該SecurityWebService的類應(yīng)該繼承Web Service類的功能。  
  3. 因此,我們添加了下面這行代碼:  
  4. public class SecurityWebService : WebService  

現(xiàn)在我們來運(yùn)用我們的面向?qū)ο蟮募记删帉懸粋€(gè)C#類。C#的類和C++、Java的類非常相象,如果你有C++和Java的基礎(chǔ),這個(gè)就是小菜一碟了。

.Net下的Web Service能夠設(shè)定一些基本的數(shù)據(jù)類型。因此,如果我們返回“int”、“float”或是“string”等數(shù)據(jù)類型的話,它能自動(dòng)將它們轉(zhuǎn)化為標(biāo)準(zhǔn)的XML輸出。然而不巧的是在大多數(shù)的情況下,我們需要同一個(gè)實(shí)體的一類數(shù)據(jù)集。下面我先舉個(gè)例子。我們的SecurityWebService股票報(bào)價(jià)服務(wù)要求用戶輸入一個(gè)公司的代號(hào),然后它會(huì)給出公司的全名以及當(dāng)前的股票價(jià)格。由此,我們需要一個(gè)公司的三條信息:

公司代號(hào)(數(shù)據(jù)類型:string)

公司全名(數(shù)據(jù)類型:string)

股票價(jià)格(數(shù)據(jù)類型:double)

我們需要將單個(gè)股票報(bào)價(jià)的數(shù)據(jù)信息分解開。可以有很多方法完成此項(xiàng)工作,我們這里用了***的枚舉數(shù)據(jù)類型。我們?cè)贑#中用了“structs”,和C++中的structs一樣。代碼如下:

  1. public struct SecurityInfo  
  2. {  
  3. public string Code;  
  4. public string CompanyName;  
  5. public double Price;  

現(xiàn)在我們已經(jīng)完成所有C#創(chuàng)建Web Service所需的模塊了。因此,所有的代碼如下:

  1. 〈%@ WebService Language="C#"   
  2. class="SecurityWebService" % 〉  
  3.  
  4. using System;  
  5. using System.Web.Services;  
  6.  
  7. public struct SecurityInfo  
  8. {  
  9. public string Code;  
  10. public string CompanyName;  
  11. public double Price;  
  12. }  
  13.  
  14. public class SecurityWebService : WebService  
  15. {  
  16. private SecurityInfo Security;  
  17.  
  18. public SecurityWebService()  
  19. {  
  20. Security.Code = "";  
  21. Security.CompanyName = "";  
  22. Security.Price = 0;  
  23. }  
  24.  
  25. private void AssignValues(string Code)  
  26. {  
  27. // 在這里使用商業(yè)組件  
  28. // 方法調(diào)用就是用來獲得所需的數(shù)據(jù)的  
  29. // 本程序中我給相應(yīng)的代碼添加了  
  30. 一個(gè)對(duì)應(yīng)的字符串以方便顯示  
  31. // 同時(shí),我使用了隨機(jī)數(shù)產(chǎn)生器來生成股票價(jià)格  
  32.  
  33. Security.Code = Code;  
  34. Security.CompanyName = Code + " Pty Ltd";  
  35. Random RandomNumber = new System.Random();  
  36. Security.Price = double.Parse(new System.  
  37. Random(RandomNumber.Next(1,10)).  
  38. NextDouble().ToString("##.##"));  
  39. }  
  40.  
  41. [WebMethod(Description="This method call will   
  42. get the company name and the price for a given   
  43. security code.",EnableSession=false)]  
  44. public SecurityInfo GetSecurityInfo(string Code)  
  45. {  
  46. AssignValues(Code);  
  47. SecurityInfo SecurityDetails = new SecurityInfo();  
  48. SecurityDetails.Code = Security.Code;  
  49. SecurityDetails.CompanyName = Security.CompanyName;  
  50. SecurityDetails.Price = Security.Price;  
  51. return SecurityDetails;  
  52. }  
  53. }  

請(qǐng)記住,這個(gè)Web Service能通過Http做任何使用。我們也許會(huì)在代碼中涉及到一些很敏感的商業(yè)數(shù)據(jù),但是卻不想它落入他人之手。那解決的方案就是保護(hù)一些邏輯函數(shù),使用戶只能訪問到一些用來顯示數(shù)據(jù)的函數(shù)。為了達(dá)到這個(gè)目的,我們使用了關(guān)鍵字“[Web Method]”。下面就是示例代碼:

  1. [WebMethod(Description="This......",EnableSession=false)]  
  2. public SecurityInfo GetSecurityInfo(string Code) 

這個(gè)函數(shù)的訪問類型是公有型的。標(biāo)簽“Description”是用來描述這個(gè)Web Service的功能的。因?yàn)槲覀儾槐貎?chǔ)存任何session數(shù)據(jù),所以我們將session狀態(tài)設(shè)置為false。

private void AssignValues(string Code)

這是一個(gè)應(yīng)該被邏輯保護(hù)的函數(shù)。因?yàn)槲覀儾幌M覀兊纳虡I(yè)機(jī)密數(shù)據(jù)能在Web被輕易的獲得,所以我們將函數(shù)的訪問類型設(shè)為private(注:在這里,即使你將函數(shù)的訪問類型設(shè)為public,這個(gè)函數(shù)還是不能被公共地訪問到,原因是關(guān)鍵字“[Web Method]”沒有被用到)。

到此,我們可以用GetSecurityInfo(string)函數(shù)來獲得***的股票價(jià)格。同時(shí),為了方便起見,我給公司代碼添加了相應(yīng)公司的名字。還有,股票的價(jià)格是隨機(jī)產(chǎn)生的。

***,我們將該文件保存在一個(gè)由IIS控制的目錄下,文件名為“SampleService.asmx”。運(yùn)行后的圖示如下:

圖2

以上是一個(gè)由.Net Framework生成的Web頁面,我們并沒有創(chuàng)建這個(gè)頁面(它是由系統(tǒng)自動(dòng)產(chǎn)生的,所以我并不需要寫任何代碼來創(chuàng)建該頁面)。這個(gè)功能使我們的工作量相對(duì)減輕了不少。同樣,你也可以通過運(yùn)用Asp.net的Pagelets功能或修改網(wǎng)頁文件使頁面以不同的方式顯示其中的內(nèi)容。

如何使用這個(gè)C#創(chuàng)建的Web Service?

現(xiàn)在我們來使用這個(gè)Web Service。我們先輸入一些值來獲得股票示例價(jià)格。

圖3

按下Invoke按鈕,我們就可以獲得以下的XML文檔:

圖4

這樣,這個(gè)Web Service就給用戶提供了其所需的信息了。因?yàn)槭荴ML格式的文檔,我們需要寫客戶端來析取這個(gè)XML文檔。客戶端可以為以下幾類:

1.一個(gè)Web頁面

2.一個(gè)控制臺(tái)或是Windows下的運(yùn)用程序

3.一個(gè)用WML語言描述的手機(jī)程序

4.一個(gè)運(yùn)用在PDA上的Palm或Win CE程序

你可以直接用Http Get方法來調(diào)用這個(gè)Web Service。這樣的話就不會(huì)出現(xiàn)***個(gè)頁面了,也不需要用戶去點(diǎn)擊Invoke按鈕了。具體方法:

http://server/webServiceName.asmx/functionName?parameter=parameterValue

調(diào)用我們的Web Service的方法就是:

http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo?Code=IBM

到此為止,我們已經(jīng)知道如何用C#創(chuàng)建并使用一個(gè)Web Service,但是任務(wù)并沒有完全完成。我們需要知道如何在Internet上找到我們的Web Service,我們的Web Service能不能也被收入在個(gè)大搜索引擎。為了解決這個(gè)問題,我們就需要建立一個(gè)“discovery”文件。

創(chuàng)建發(fā)現(xiàn)文件

在訪問一個(gè)已有的Web Service以前,你必須先得找到并整合這個(gè)Web Service,這個(gè)過程就是Web Service的發(fā)現(xiàn)過程。通過這個(gè)發(fā)現(xiàn)過程,你才知道這個(gè)Web Service能為你提供什么樣的服務(wù)以及你怎么和它實(shí)現(xiàn)互動(dòng)。發(fā)現(xiàn)文件是一個(gè)以.DISCO為擴(kuò)展名的XML文件。在實(shí)際運(yùn)用中,你是不必為每一個(gè)Web Service創(chuàng)建發(fā)現(xiàn)文件的。以下就是一個(gè)發(fā)現(xiàn)文件的例子:

  1. 〈?xml version="1.0" ?〉  
  2. 〈disco:discovery xmlns:disco="  
  3. http://schemas.xmlsoap.org/disco/"〉  
  4. 〈scl:contractRef ref="  
  5. http://localhost/work/aspx/SampleService.asmx?SDL"/〉  
  6. 〈/disco:discovery〉 

我們先將這個(gè)文件命名為“SampleService.disco”,并將它保存在該Web Service的目錄下。如果我們是在“/work/aspx”目錄下創(chuàng)建Web Service的話,我們就可以運(yùn)用更靈活的“動(dòng)態(tài)發(fā)現(xiàn)”了。“動(dòng)態(tài)發(fā)現(xiàn)”能自動(dòng)為我們檢測“/work/aspx”目錄以及子目錄下的所有*.DISCO文件的,這樣就省了我們不少功夫。

  1. 〈?xml version="1.0" ?〉  
  2. 〈dynamicDiscovery xmlns="  
  3. urn:schemas-dynamicdiscovery:disco.2000-03-17"〉  
  4. 〈/dynamicDiscovery〉  

你可以在http://services3.xmethods.net/dotnet/default.disco獲得一份能使用的發(fā)現(xiàn)文件。通過分析發(fā)現(xiàn)文件,我們可以找到所需的Web Service。然而,在得到發(fā)現(xiàn)文件前你必須知道這個(gè)發(fā)現(xiàn)文件的確切的URL。否則你還是找不到你要的發(fā)現(xiàn)文件的,那么你當(dāng)然就不能找到你要的Web Service了。這樣,我們現(xiàn)在就要用到一項(xiàng)新技術(shù)了――通用發(fā)現(xiàn),描述和整合(Universal Description,Discovery,and Integration,UDDI)來為已存在的Web Service做宣傳了。UDDI是公開的,基于Internet的。這項(xiàng)技術(shù)目前還處于起初階段,所以正不斷發(fā)展著。你可以在http://uddi.microsoft.com/ 獲得有關(guān)UDDI的參考。

發(fā)布這個(gè)Web Service

發(fā)布Web Service是很簡單的。和Asp.net的程序差不多,你只要將.asmx文件和.disco文件拷貝到相應(yīng)的目錄,這樣如果一切正常,這個(gè)Web Service就可以工作了。

展望Web Service的未來

Web Service技術(shù)的前途是相當(dāng)光明的。在推動(dòng)Web Service技術(shù)向前發(fā)展的道路上,不僅微軟注入了很大的投資,Sun、IBM等也表示很大的興趣。同時(shí),網(wǎng)上還有為Apache和Java Web開發(fā)的SOAP工具包。然而,Web Service起步不久,還需要很多的工作要做。特別在國內(nèi),Web Service技術(shù)起步比國外有晚了一步,所以更要抓緊時(shí)間、迎接挑戰(zhàn)。

【編輯推薦】

  1. C#中定義裝箱和拆箱詳解
  2. 淺談C#類型系統(tǒng)
  3. 三種不同的C#異常類型
  4. 詳細(xì)介紹C#編譯器
  5. C#異常機(jī)制的相關(guān)解釋
責(zé)任編輯:冰荷 來源: cnblogs
相關(guān)推薦

2009-08-20 15:38:50

C#建立Web Ser

2009-08-11 11:07:49

Java調(diào)用C# we

2009-08-14 15:02:24

Service模板C#創(chuàng)建

2009-04-13 11:31:55

IBMdWWebService

2009-08-11 14:16:00

Winform調(diào)用WEC#

2009-08-24 17:34:14

C#創(chuàng)建XML Web

2009-01-19 11:07:42

C#Web.NET

2009-08-11 13:07:26

C#類庫中添加Web

2009-08-06 16:44:03

C#創(chuàng)建WebServ

2009-08-06 16:13:16

C# Web Serv

2009-09-03 17:36:13

C#創(chuàng)建Web應(yīng)用程序

2009-08-06 15:35:34

C# Web Serv

2009-12-08 17:16:37

WCF Web Ser

2009-08-24 17:50:39

C#項(xiàng)目案例

2015-05-12 14:16:15

C#ActiveX控件web調(diào)用

2009-08-12 17:44:30

C# Web Serv

2009-09-04 17:58:38

C# Web Brow

2009-01-19 10:03:58

C#XML動(dòng)態(tài)分層菜單

2009-08-10 13:40:46

創(chuàng)建C# COM對(duì)象

2009-09-03 09:40:57

C#創(chuàng)建表單
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品久久久久久久午夜片 | 美女黄网站 | 一区日韩 | 国产网站在线 | 国产高清在线精品一区二区三区 | 欧美aaa级| 91中文字幕在线观看 | 精品亚洲一区二区三区 | 久久久成人免费一区二区 | 国产高清免费视频 | 日韩精品中文字幕一区二区三区 | 午夜a√| 日韩在线中文字幕 | 成人免费淫片aa视频免费 | 日韩国产精品一区二区三区 | a级性视频 | 亚洲色图婷婷 | 日日操日日舔 | 欧美一级特黄aaa大片在线观看 | 亚洲 欧美 综合 | 狠狠操狠狠操 | 99九九久久 | 日韩有码一区 | 狠狠的日| 精品免费国产一区二区三区四区介绍 | 日本精品视频一区二区 | 久久久久亚洲av毛片大全 | 日韩一区二区在线视频 | 国产精品黄视频 | 国产久视频 | 九九激情视频 | 中文字幕日韩一区二区 | 国产区在线观看 | 国产视频1区2区 | 国产高清免费 | 日本在线精品视频 | 日本成人二区 | 中文字幕人成乱码在线观看 | 成人二区 | 日韩成人在线播放 | 国产美女自拍视频 |