上篇文章介紹了些webservice的基本特性和我們例子的結構,這篇文章我們將開始具體的代碼編寫工作.
這個專題主要講述的是webservice,因此這裡我們的代碼以Webservice相關為主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只將簡略介紹.
在VS2003中,開發一個webservice並不是件困難的事,首先,我們建立一個webservice項目(檔案->建立->項目->C#->Web服務應用程式)
建完這個工程,我們將看到一個叫Service1.asmx的檔案,這就是webservice的標準檔案,它也有UI的概念,不過我們一般不關注,因此,我們查看其cs代碼檔案.如果你什麼都還沒做的話,將看見一個被注釋掉的helloworld的WebMethod,把注釋去掉,在運行,你就可以得到最簡單的webservice運行執行個體了.點擊"helloworld"將執行其方法.顯然,這個函數對我們的意義只在於宏觀的瞭解了下web服務的寫法.
下面,我們將開始具體介紹webservice的寫法.在代碼檔案裡,如果我們寫了一個函數後,希望此函數成為外部可調用的介面函數,我們必須在函數上面添上一行代碼[WebMethod(Description="函數的描述資訊")],如果你的函數沒有這個申明,它將不能被使用者引用.如:
[WebMethod(Description="最簡單的方法")]
public string HelloWorld()
{
return "Hello World";
}
這個函數就是外部可調用的介面函數,對使用者來說相當於一個API.如果某使用者在引用了這個服務後,他調用HelloWorld()方法,他就將獲得"HelloWorld"這個傳回值.
看到這裡,我們是不是發現,其實webservice並不是那麼的神秘,它也不過只是個介面,對我們而言,側重點依然是介面函數的編寫.下面,我將給出我們的例子所需要的介面函數.
[WebMethod(Description="查詢以擷取需要的課件資訊")]
public XmlDataDocument GetSiteAData(string AssignName)
{
XmlDataDocument xd=new XmlDataDocument(); //
DataSet ds=new DataSet();
CStoreProc cp=new CStoreProc("SearchAssign");
cp.AddParIn("@keywords",SqlDbType.VarChar,30,AssignName);
cp.AddParOut("@res",SqlDbType.Int);
if(cp.SelectProc()) //如果執行成功,預存程序
{
cp.myData.EnforceConstraints=false; //不進行格式嚴格檢查
if((int)cp.GetReturnValue("@res")==-1)
{
string xml="<NewDataSet></NewDataSet>";
xd.LoadXml(xml);
return xd;
}
xd=new XmlDataDocument(cp.myData);
XmlNode root1=xd.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 xd;
}
else return null;
}
這是擷取資來源站點點資訊的一個介面函數.裡面大部分的代碼,我想對於有一定asp.net基礎的朋友來說,都應該是一看就明白,這裡只說明下CStoreProc,這是我封裝的一個預存程序類,主要功能是執行各種類型的預存程序.
細心的朋友可能會發現這個函數的傳回型別似乎比較特殊,是個xml的文檔.我們在前面已經說過,webservice只能傳輸序列化資料,xml顯然滿足條件,但比如hash表之類的非序列化資料,是不能傳輸的,xml使用最為廣泛,而且考慮到跨平台應用,所以這裡我們只以xml資料的傳輸來樣本.
在下篇文章,我們將深入解析webservice的精髓---xml 資料轉送:)
From:IT實驗室