久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

運(yùn)用C#創(chuàng)建一個(gè).Net下的Web Service

 迷之霧 2011-03-24

 微軟在其.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#建立一個(gè)Web Service,。通過(guò)文章,,我們還將對(duì)WSDL,、UDDI以及未來(lái)的Web Service有一個(gè)大致的了解。

  為什么需要Web Service?

  以前,,分布式的應(yīng)用程序邏輯需要使用分布式的對(duì)象模型,,通過(guò)使用DCOM,、CORBA,、RMI之類的基本結(jié)構(gòu),開(kāi)發(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è)共同的缺陷,那就是它們無(wú)法擴(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)來(lái)解決這個(gè)問(wèn)題。如此的情況下就迎來(lái)了Web Service的誕生,。

  什么是Web Service?

  Web Service 是一種新的Web應(yīng)用程序分支,,他們是自包含、自描述,、模塊化的應(yīng)用,,可以發(fā)布、定位,、通過(guò)Web調(diào)用,。Web Service可以執(zhí)行從簡(jiǎn)單的請(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ù)和基于組件開(kāi)發(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)流行了較長(zhǎng)一段時(shí)間了,。然而這些模型都是依賴于一個(gè)特定的對(duì)象模型協(xié)議,。Web Service擴(kuò)展了這些模型,使之可以和簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(Simple Object Access Protocol,,SOAP)以及XML通信以根除特定對(duì)象模型協(xié)議帶來(lái)的障礙,。可將WebService視作Web上的組件編程,。(參見(jiàn)如圖1)

  Web Service基本上是利用超文本傳送協(xié)議(HTTP)和SOAP來(lái)使商業(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ì)象上通過(guò)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ù)描述語(yǔ)言(Service Description Language, SDL),,SOAP契約語(yǔ)言(SOAP Contract Language,,SCL)以及網(wǎng)絡(luò)可訪問(wèn)性規(guī)格語(yǔ)言(Network Accessible Specification Language,NASSL)都是為了這個(gè)目的而建立的XML類語(yǔ)言,。然而,,IBM和微軟最近同意將Web服務(wù)描述語(yǔ)言(Web Service Description Language,,WSDL)作為Web Service的標(biāo)準(zhǔn),。

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

  面臨的任務(wù)

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

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

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

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

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

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

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

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

  創(chuàng)建一個(gè)Web Service

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

<%@ WebService Language="C#" class="SecurityWebService" %>  <%@ WebService Language="C#" class="SecurityWebService" %>

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

using System;using System.Web.Services;

  該SecurityWebService的類應(yīng)該繼承Web Service類的功能,。因此,我們添加了下面這行代碼:

public class SecurityWebService : WebService

  現(xiàn)在我們來(lái)運(yùn)用我們的面向?qū)ο蟮募记删帉?xiě)一個(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ù)信息分解開(kāi),。可以有很多方法完成此項(xiàng)工作,,我們這里用了最好的枚舉數(shù)據(jù)類型,。我們?cè)贑#中用了“structs”,和C++中的structs一樣,。代碼如下:

public struct SecurityInfo
{
public string Code;
public string CompanyName;
public double Price;
}

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

<%@ WebService Language="C#" class="SecurityWebService" %>

using System;
using System.Web.Services;

public struct SecurityInfo
{
public string Code;
public string CompanyName;
public double Price;
}

public class SecurityWebService : WebService
{
private SecurityInfo Security;

public SecurityWebService()
{
Security.Code = "";
Security.CompanyName = "";
Security.Price = 0;
}

private void AssignValues(string Code)
{
// 在這里使用商業(yè)組件
// 方法調(diào)用就是用來(lái)獲得所需的數(shù)據(jù)的
// 本程序中我給相應(yīng)的代碼添加了一個(gè)對(duì)應(yīng)的字符串以方便顯示
// 同時(shí),我使用了隨機(jī)數(shù)產(chǎn)生器來(lái)生成股票價(jià)格

Security.Code = Code;
Security.CompanyName = Code + " Pty Ltd";
Random RandomNumber = new System.Random();
Security.Price = double.Parse(new System.Random(RandomNumber.Next(1,10)).NextDouble().ToString("##.##"));
}

[WebMethod(Description="This method call will get the company name and the price for a given security code.",EnableSession=false)]
public SecurityInfo GetSecurityInfo(string Code)
{
AssignValues(Code);
SecurityInfo SecurityDetails = new SecurityInfo();
SecurityDetails.Code = Security.Code;
SecurityDetails.CompanyName = Security.CompanyName;
SecurityDetails.Price = Security.Price;
return SecurityDetails;
}
}

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

[WebMethod(Description="This......",EnableSession=false)]

public SecurityInfo GetSecurityInfo(string Code)

  這個(gè)函數(shù)的訪問(wèn)類型是公有型的。標(biāo)簽“Description”是用來(lái)描述這個(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ù)的訪問(wèn)類型設(shè)為private(注:在這里,即使你將函數(shù)的訪問(wèn)類型設(shè)為public,,這個(gè)函數(shù)還是不能被公共地訪問(wèn)到,,原因是關(guān)鍵字“[Web Method]”沒(méi)有被用到)。

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

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

  圖2

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

      如何使用這個(gè)Web Service,?    

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

  圖3

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

這樣,這個(gè)Web Service就給用戶提供了其所需的信息了,。因?yàn)槭荴ML格式的文檔,,我們需要寫(xiě)客戶端來(lái)析取這個(gè)XML文檔??蛻舳丝梢詾橐韵聨最?

  1.一個(gè)Web頁(yè)面
  2.一個(gè)控制臺(tái)或是Windows下的運(yùn)用程序
  3.一個(gè)用WML語(yǔ)言描述的手機(jī)程序
  4.一個(gè)運(yùn)用在PDA上的Palm或Win CE程序

  你可以直接用Http Get方法來(lái)調(diào)用這個(gè)Web Service,。這樣的話就不會(huì)出現(xiàn)第一個(gè)頁(yè)面了,也不需要用戶去點(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ù)并沒(méi)有完全完成,。我們需要知道如何在Internet上找到我們的Web Service,,我們的Web Service能不能也被收入在個(gè)大搜索引擎。為了解決這個(gè)問(wèn)題,,我們就需要建立一個(gè)“discovery”文件,。

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

  在訪問(wèn)一個(gè)已有的Web Service以前,你必須先得找到并整合這個(gè)Web Service,,這個(gè)過(guò)程就是Web Service的發(fā)現(xiàn)過(guò)程,。通過(guò)這個(gè)發(fā)現(xiàn)過(guò)程,你才知道這個(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)文件的例子:

<?xml version="1.0" ?>
<disco:discovery xmlns:disco="http://schemas./disco/">
<scl:contractRef ref="http://localhost/work/aspx/SampleService.asmx?SDL"/>
</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)為我們檢測(cè)“/work/aspx”目錄以及子目錄下的所有*.DISCO文件的,這樣就省了我們不少功夫,。

<?xml version="1.0" ?>
<dynamicDiscovery xmlns="urn:schemas-dynamicdiscovery:disco.2000-03-17">
</dynamicDiscovery>

  你可以在http://services3./dotnet/default.disco獲得一份能使用的發(fā)現(xiàn)文件,。通過(guò)分析發(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)來(lái)為已存在的Web Service做宣傳了,。UDDI是公開(kāi)的,,基于Internet的。這項(xiàng)技術(shù)目前還處于起初階段,,所以正不斷發(fā)展著,。你可以在http://uddi.microsoft.com/ 獲得有關(guān)UDDI的參考。

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

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

  展望Web Service的未來(lái)

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


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多