一個C#中webservice的初級例子(一)

一個webservice的初級例子
    首先,我們必須瞭解什麼是webservice.就概念上來說,可能比較複雜,不過我們可以有個宏觀的瞭解:webservice就是個對外的接口,裏面有函數可供外部客戶調用(注意:裏面同樣有客戶不可調用的函數).假若我們是服務端,我們寫好了個webservice,然後把它給了客戶(同時我們給了他們調用規則),客戶就可以在從服務端獲取信息時處於一個相對透明的狀態.即是客戶不瞭解(也不需要)其過程,他們只獲取數據.
    webservice傳遞的數據只能是序列化的數據,典型的就是xml數據,這裏我們也只討論xml數據的傳輸.
   
有了一些對xml webservice的初步瞭解後,我們將切入正題,即是用一個具體的webservice事例的形式來講解具體的webservice用法,用具體的事例來講解一個概念我想怎麼也要比單純的說理能讓人容易理解吧.
    這裏,我們將以一個簡單的分佈式課件搜索系統爲例來講解.使用VS2003爲編譯環境,C#爲語言,SqlServcer2000爲數據庫.(這個例子來源於一位網上朋友的文章的啓發,覺得很能代表webservice的特點,就按那個想法做了這麼個系統來示例了)
   
首先,明確我們要做什麼.我們需要一個對客戶的接口,也就是個站點,我們把它稱做ServiceGatherSite,它是何種形式都無所謂,甚至它本身並不需要數據庫,它只是提供給用戶一個查詢的接口,真正的服務,普通用戶是不接觸到的.然後,這裏我們還需要若干個提供服務的站點,我們可以稱它們爲資源站,這裏爲簡單起見,假設有兩個資源站,分別叫WebSiteA,WebSiteB,它們可以是不對外公佈的,只是爲了豐富查詢數據而存在.最後,是我們最需要關注的東西---資源站提供給ServiceGatherSite的服務.兩個資源站,就有兩個服務,我們稱爲SiteAService和SiteBService.兩個服務間沒有任何關係,內部提供的方法也完全沒關聯,只是需要把方法如何使用告訴ServiceGatherSite,意思是,服務只提供查詢接口,返回的數據如何處理,服務本身並不管,全由使用服務的站點分配.
     寫了這麼多,算是簡要的介紹了下有關xml webservice的概念和我們這個例子的結構,下篇文章,我們將開始真正進入代碼的設計階段.
       
在VS2003中,開發一個webservice並不是件困難的事,首先,我們新建一個webservice項目(文件->新建->項目->C#->Web服務應用程序)
    建完這個工程,我們將看到一個叫Service1.asmx的文件,這就是webservice的標準文件,它也有UI的概念,不過我們一般不關注,因此,我們查看其cs代碼文件.如果你什麼都還沒做的話,將看見一個被註釋掉的helloworld的WebMethod,把註釋去掉,在運行,你就可以得到最簡單的webservice運行實例了.點擊"helloworld"將執行其方法.顯然,這個函數對我們的意義只在於宏觀的瞭解了下web服務的寫法.
    
下面,我們將開始具體介紹webservice的寫法.在代碼文件裏,如果我們寫了一個函數後,希望此函數成爲外部可調用的接口函數,我們必須在函數上面添上一行代碼[WebMethod(Description="函數的描述信息")],如果你的函數沒有這個申明,它將不能被用戶引用.如:    這個函數就是外部可調用的接口函數,對用戶來說相當於一個API.如果某用戶在引用了這個服務後,他調用HelloWorld()方法,他就將獲得"HelloWorld"這個返回值.
   
看到這裏,我們是不是發現,其實webservice並不是那麼的神祕,它也不過只是個接口,對我們而言,側重點依然是接口函數的編寫.下面,我將給出我們的例子所需要的接口函數.
           這是獲取資源站點信息的一個接口函數.裏面大部分的代碼,我想對於有一定asp.net基礎的朋友來說,都應該是一看就明白,這裏只說明下CStoreProc,這是我封裝的一個存儲過程類,主要功能是執行各種類型的存儲過程.
          細心的朋友可能會發現這個函數的返回類型似乎比較特殊,是個xml的文檔.我們在前面已經說過,webservice只能傳輸序列化數據,xml顯然滿足條件,但比如hash表之類的非序列化數據,是不能傳輸的,xml使用最爲廣泛,而且考慮到跨平臺應用,所以這裏我們只以xml數據的傳輸來示例.
          函數功能很簡單,只是要返回查詢結果,其數據格式是XmlDataDocument.當查詢失敗時(無匹配查詢結果),我們構造一個xml,返回一個空記錄.否則,我們把查詢後的dataset生成一個
      好了,webservice的方法函數介紹完了(這裏還有個web服務方法,稍後介紹),接下來我們的任務是怎麼調用它了.首先把webservice的項目編譯完成,假定我們這個服務是針對資源站點A的,我們不妨稱其爲ServiceA.先單獨運行asmx文件,執行GetSiteAData(string AssignName)方法,將提示你輸入參數,你輸入要搜索的內容,點確認,將返回給你一個xml數據,並在ie上顯示出來,這就是你搜索到的內容拉.
        這裏對ServiceA的工作再做點介紹,在我們這個項目裏,它是資源站點A提供的服務,意思是,它查詢的數據將全來源於站點A,而站點A資源添加在本項目也有專門的工程實現.
        好了,回到正題.這裏我介紹vs調用webservice的方法,其實其他平臺的調用方法也是大同小異.首先我們介紹web引用方式,這種方式我強烈建議調試時使用,非常方便.右擊引用,點添加web引用,輸入你的webservice地址,如:http://localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必須保證你輸入的webservice存在.然後引用即可,注意:web引用名將作爲你加入的webservice的名字空間.比如你輸入了:SiteA,那服務的實例化將是這樣:SiteA.Service1 serviceA=new SiteA.Service1();(Service1是服務的類名).另一種引用的方法是產生一個代理類,編譯成dll,在引用的地方把這個dll引用進去,不過這種方法有個缺點:就是當web服務修改了以後必須重新編譯

[WebMethod(Description="最簡單的方法")]
  
public string HelloWorld()
  {
   
return "Hello World";
  }

 

 [WebMethod(Description="查詢以獲取需要的課件信息")]
  
public XmlDataDocument GetSiteAData(string AssignName)
  {
   DataSet dsNorthwind 
= new DataSet();
  
//Create the connection string.           
   String sConnect;
   sConnect
="Password=eaiuser;User ID=eaiuser;Data Source=eaitest";     
         
   
//Create a connection object to connect to the northwind db.
   OracleConnection nwconnect = new OracleConnection(sConnect);
    
//Create a command string to select all the customers in the WA region.
   String sCommand = "Select * from users";
    
//Create an adapter to load the DataSet.
   OracleDataAdapter myDataAdapter = new OracleDataAdapter(sCommand, nwconnect);
    
//Fill the DataSet with the selected records.
   myDataAdapter.Fill(dsNorthwind,"users");
    
//Load the document with the DataSet.
   XmlDataDocument doc = new XmlDataDocument(dsNorthwind);   
     
//Display the XmlDataDocument.
   doc.Save(Console.Out);
     
if(true//如果執行成功,存儲過程
   {
    XmlNode root1
=doc.DocumentElement; 
    XmlNodeList roots
=root1.SelectNodes("list");   
    
foreach(XmlNode roota in  roots)  //爲所有元素加上站點名稱標記
    {
     XmlElement Link
=xd.CreateElement("SiteName"); 
     Link.InnerText
=ConfigurationSettings.AppSettings["SiteName"].ToString();
     roota.AppendChild(Link);
    }
    
return doc;
   }
   
else return null;
}
 

 

發佈了37 篇原創文章 · 獲贊 1 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章