webservice實例(二)

qq羣:19877329
By: jfan 2007-07-23
上篇文章介紹了些webservice的基本特性和我們例子的結構,這篇文章我們將開始具體的代碼編寫工作.
     這個專題主要講述的是webservice,因此這裏我們的代碼以Webservice相關爲主,而其他工程,例如:usewebservice只作簡略介紹.
      VS2005,開發一個webservice並不是件困難的事,首先,我們新建一個webservice項目(文件->新建->網站->ASP.NET WEB服務)
      建完這個工程,我們將看到一個叫Service.asmx的文件,這就是webservice的標準文件,它也有UI的概念,不過我們一般不關注,因此,我們查看其cs代碼文件.如果你什麼都還沒做的話,將看見一個被註釋掉的helloworldWebMethod,把註釋去掉,在運行,你就可以得到最簡單的webservice運行實例了.點擊"helloworld"將執行其方法.顯然,這個函數對我們的意義只在於宏觀的瞭解了下web服務的寫法.
     下面,我們將開始具體介紹webservice的寫法.在代碼文件裏,如果我們寫了一個函數後,希望此函數成爲外部可調用的接口函數,我們必須在函數上面添上一行代碼[WebMethod(Description="函數的描述信息")],如果你的函數沒有這個申明,它將不能被用戶引用.:
[WebMethod(Description="最簡單的方法")]
  public string HelloWorld()
  {
   return "Hello World";
  }
     這個函數就是外部可調用的接口函數,對用戶來說相當於一個API.如果某用戶在引用了這個服務後,他調用HelloWorld()方法,他就將獲得"HelloWorld"這個返回值.
API (Application Programming Interface)
所謂API本來是爲CC++程序員寫的。API說來說去,就是一種函數,他們包含在一個附加名爲DLL的動態連接庫文件中。用標準的定義來講,API就是Windows32位應用程序編程接口,是一系列很複雜的函數,消息和結構,它使編程人員可以用不同類型的編程語言編制出的運行在Windows95 Windows NT操作系統上的應用程序。
       看到這裏,我們是不是發現,其實webservice並不是那麼的神祕,它也不過只是個接口,對我們而言,側重點依然是接口函數的編寫.下面,我將給出我們的例子所需要的接口函數.
public class Service : System.Web.Services.WebService
{
AdoNetCon anc = new AdoNetCon(ConfigurationSettings.AppSettings["ZWOAConnectionString"]);
//這是我寫的一個類,用來操作數據庫
    public Service () {
        //如果使用設計的組件,請取消註釋以下行
        //InitializeComponent();
    }
 
    [WebMethod(Description="hello method")]
    public string HelloWorld() {
        return "Hello World";
    }
 
    [WebMethod(Description = "獲取需要的信息")]
    public XmlDataDocument GetSiteAData()
    {
        DataSet ds = new DataSet();
        try
        {
            ds = anc.RunProc("select car_id,car_chePai,car_trademark from [zw_db].[dbo].tb_car",ds);
            XmlDataDocument xd = new XmlDataDocument(ds);
            return xd;
        }
        catch
        {
            //System.Web.HttpContext.Current.Response.Write("Error!");
            return null;
        }
    }
 
    [WebMethod(Description = "查詢獲取需要的信息")]
    public XmlDataDocument getCar(string car_id,string car_chePai)
    {
        DataSet ds = new DataSet();
        try
        {
            string sql;
            sql = "select car_id,car_chePai,car_trademark from [zw_db].[dbo].tb_car where 1=1";
            if ((car_id == null) || (car_id.Length == 0))
                ;
            else
                sql = sql +" and car_id =" + "'" + car_id + "'";
            if ((car_chePai == null) || (car_chePai.Length == 0))
                ;
            else
                sql = sql + " and car_chePai like " + "'%" + car_chePai + "%'";
            ds = anc.RunProc(sql, ds);
            XmlDataDocument xd = new XmlDataDocument(ds);
            return xd;
        }
        catch
        {
            //System.Web.HttpContext.Current.Response.Write("Error!");
            return null;
        }
    }
 
    [WebMethod(Description = "insert")]
    public bool addCar(string car_chePai)
    {
        try
        {
            string sql;
            sql = "insert into [zw_db].[dbo].tb_car(car_chePai) values(" + "'" + car_chePai + "'" + ")";
            if ((car_chePai == null) || (car_chePai.Length == 0))
                return false;
            else
            {
                anc.RunProc(sql);
                return true;
            }
        }
        catch
        {
            //System.Web.HttpContext.Current.Response.Write("Error!");
            return false;
        }
    }
 
}
這是獲取資源站點信息的一個接口函數.裏面大部分的代碼,我想對於有一定asp.net基礎的朋友來說,都應該是一看就明白。
細心的朋友可能會發現這個函數的返回類型似乎比較特殊,是個xml的文檔.我們在前面已經說過,webservice只能傳輸序列化數據,xml顯然滿足條件,但比如hash表之類的非序列化數據,是不能傳輸的,xml使用最爲廣泛,而且考慮到跨平臺應用,所以這裏我們只以xml數據的傳輸來示例.
我們先簡單解釋下GetSiteAData()函數.
      函數功能很簡單,只是要返回查詢結果,其數據格式是XmlDataDocument.當查詢失敗時(無匹配查詢結果),返回一個空記錄.否則,我們把查詢後的dataset生成一個XmlDataDocument,接下來,由於該項目的需要,我加入了一個循環,添加dataset裏所沒有的節點,站點名稱.在這之後,算是完成了一個符合我們期望格式的xml數據文檔,我們把它返回.
       好了,webservice的方法函數介紹完了(這裏還有個web服務方法,稍後介紹),接下來我們的任務是怎麼調用它了.首先把webservice的項目編譯完成,假定我們這個服務是針對資源站點A,我們不妨稱其爲ServiceA.先單獨運行asmx文件,執行GetSiteAData()方法,將提示你輸入參數,你輸入要搜索的內容,點確認,將返回給你一個xml數據,並在ie上顯示出來,這就是你搜索到的內容拉.
        這裏對ServiceA的工作再做點介紹,在我們這個項目裏,它是資源站點A提供的服務,意思是,它查詢的數據將全來源於站點A,而站點A資源添加在本項目也有專門的工程實現.
        好了,回到正題.這裏我介紹vs調用webservice的方法,其實其他平臺的調用方法也是大同小異.首先我們介紹web引用方式,這種方式我強烈建議調試時使用,非常方便.右擊引用,點添加web引用,輸入你的webservice地址,你必須保證你輸入的webservice存在.然後引用即可,注意:web引用名將作爲你加入的webservice的名字空間.比如你輸入了: localhost,那服務的實例化將是這樣: localhost.Service1 serviceA=new localhost.Service1();(Service1是服務的類名).
      完成了這一步,service的調用似乎變的那麼簡單,我們已經實現了遠程實例化,接下來的遠程調用也是一樣的容易.下面給出資源採集站ServiceGatherSite的綁定代碼(只採集A站點的信息)
XmlDataDocument xd = new XmlDataDocument();
    DataSet ds = new DataSet();
    protected void Page_Load(object sender, EventArgs e)
    {
        localhost.Service ge = new localhost.Service();
        XmlNode xmlNode1;
        XmlDataDocument xd = new XmlDataDocument();
        StringBuilder xmlString1;
        xmlNode1 = ge.GetSiteAData();
        if (xmlNode1 == null) //--存儲過程執行失敗
            return;
        xmlString1 = new StringBuilder(xmlNode1.OuterXml);
        if (xmlString1.ToString().Equals("<NewDataSet xmlns=/"/"></NewDataSet>"))
            return;
        xd.LoadXml(xmlString1.ToString());
        ds.ReadXml(new XmlNodeReader(xd));
        GridView1.DataSource = ds.Tables[0].DefaultView;
        GridView1.DataBind();}
此段代碼給出了xml轉化成dataset的解決方案,雖然這不是必須的,但畢竟在asp.net,dataset佔的作用之重,誰都知道的.其他的請朋友們先看(呵呵,箇中高手就免了)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章