首先,我們必須了解什么是webservice.就概念上來說,可能比較復(fù)雜,不過我們可以有個宏觀的了解:webservice就是個對外的接口,里面有 函數(shù)可供外部客戶調(diào)用(注意:里面同樣有客戶不可調(diào)用的函數(shù)).假若我們是服務(wù)端,我們寫好了個webservice,然后把它給了客戶(同時我們給了他 們調(diào)用規(guī)則),客戶就可以在從服務(wù)端獲取信息時處于一個相對透明的狀態(tài).即是客戶不了解(也不需要)其過程,他們只獲取數(shù)據(jù).
webservice傳遞的數(shù)據(jù)只能是序列化的數(shù)據(jù),典型的就是xml數(shù)據(jù),這里我們也只討論XML數(shù)據(jù)的傳輸.
有了一些對XML webservice的初步了解后,我們將切入正題,即是用一個具體的webservice事例的形式來講解具體的webservice用法,用具體的事例來講解一個概念我想怎么也要比單純的說理能讓人容易理解吧.
這里,我們將以一個簡單的分布式課件搜索系統(tǒng)為例來講解.使用VS2003為編譯環(huán)境,C#為語言,SqlServcer2000為數(shù)據(jù)庫.(這個例子來 源于一位網(wǎng)上朋友的文章的啟發(fā),覺得很能代表webservice的特點,就按那個想法做了這么個系統(tǒng)來示例了)
首先,明確我們要做什么.我們需要一個對客戶的接口,也就是個站點,我們把它稱做ServiceGatherSite,它是何種形式都無所謂,甚至它本身 并不需要數(shù)據(jù)庫,它只是提供給用戶一個查詢的接口,真正的服務(wù),普通用戶是不接觸到的.然后,這里我們還需要若干個提供服務(wù)的站點,我們可以稱它們?yōu)橘Y源 站,這里為簡單起見,假設(shè)有兩個資源站,分別叫WebSiteA,WebSiteB,它們可以是不對外公布的,只是為了豐富查詢數(shù)據(jù)而存在.后,是我們 需要關(guān)注的東西---資源站提供給ServiceGatherSite的服務(wù).兩個資源站,就有兩個服務(wù),我們稱為SiteAService和 SiteBService.兩個服務(wù)間沒有任何關(guān)系,內(nèi)部提供的方法也完全沒關(guān)聯(lián),只是需要把方法如何使用告訴ServiceGatherSite,意思 是,服務(wù)只提供查詢接口,返回的數(shù)據(jù)如何處理,服務(wù)本身并不管,全由使用服務(wù)的站點分配.
寫了這么多,算是簡要的介紹了下有關(guān)XML webservice的概念和我們這個例子的結(jié)構(gòu),下篇文章,我們將開始真正進入代碼的設(shè)計階段.
上篇文章介紹了些webservice的基本特性和我們例子的結(jié)構(gòu),這篇文章我們將開始具體的代碼編寫工作.
這個專題主要講述的是webservice,因此這里我們的代碼以Webservice相關(guān)為主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只將簡略介紹.
在VS2003中,開發(fā)一個webservice并不是件困難的事,首先,我們新建一個webservice項目(文件->新建->項目->C#->Web服務(wù)應(yīng)用程序)
建完這個工程,我們將看到一個叫Service1.asmx的文件,這就是webservice的標準文件,它也有UI的概念,不過我們一般不關(guān)注,因 此,我們查看其cs代碼文件.如果你什么都還沒做的話,將看見一個被注釋掉的helloworld的WebMethod,把注釋去掉,在運行,你就可以得 到簡單的webservice運行實例了.點擊"helloworld"將執(zhí)行其方法.顯然,這個函數(shù)對我們的意義只在于宏觀的了解了下web服務(wù)的寫 法.
下面,我們將開始具體介紹webservice的寫法.在代碼文件里,如果我們寫了一個函數(shù)后,希望此函數(shù)成為外部可調(diào)用的接口函數(shù),我們必須在函數(shù)上面 添上一行代碼[WebMethod(Description="函數(shù)的描述信息")],如果你的函數(shù)沒有這個申明,它將不能被用戶引用.如:
以下是引用片段:
[WebMethod(Description="簡單的方法")]
public string HelloWorld()
{
return "Hello World";
}
這個函數(shù)就是外部可調(diào)用的接口函數(shù),對用戶來說相當于一個API.如果某用戶在引用了這個服務(wù)后,他調(diào)用HelloWorld()方法,他就將獲得"HelloWorld"這個返回值.
看到這里,我們是不是發(fā)現(xiàn),其實webservice并不是那么的神秘,它也不過只是個接口,對我們而言,側(cè)重點依然是接口函數(shù)的編寫.下面,我將給出我們的例子所需要的接口函數(shù).
[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()) //如果執(zhí)行成功,存儲過程
{
cp.myData.EnforceConstraints=false; //不進行格式嚴格檢查
if((int)cp.GetReturnValue("@res")==-1)
{
string XML="";
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;
}
這是獲取資源站點信息的一個接口函數(shù).里面大部分的代碼,我想對于有一定ASP.NET基礎(chǔ)的朋友來說,都應(yīng)該是一看就明白,這里只說明下CStoreProc,這是我封裝的一個存儲過程類,主要功能是執(zhí)行各種類型的存儲過程.
細心的朋友可能會發(fā)現(xiàn)這個函數(shù)的返回類型似乎比較特殊,是個xml的文檔.我們在前面已經(jīng)說過,webservice只能傳輸序列化數(shù)據(jù),xml顯然滿足 條件,但比如hash表之類的非序列化數(shù)據(jù),是不能傳輸?shù)?xml使用為廣泛,而且考慮到跨平臺應(yīng)用,所以這里我們只以XML數(shù)據(jù)的傳輸來示例.
接上篇文章,我們先簡單解釋下GetSiteAData(string AssignName)函數(shù).
函數(shù)功能很簡單,只是要返回查詢結(jié)果,其數(shù)據(jù)格式是XmlDataDocument.當查詢失敗時(無匹配查詢結(jié)果),我們構(gòu)造一個xml,返回一個空記 錄.否則,我們把查詢后的dataset生成一個XmlDataDocument,接下來,由于該項目的需要,我加入了一個循環(huán),添加dataset里所 沒有的節(jié)點,站點名稱.在這之后,算是完成了一個符合我們期望格式的XML數(shù)據(jù)文檔,我們把它返回.
好了,webservice的方法函數(shù)介紹完了(這里還有個web服務(wù)方法,稍后介紹),接下來我們的任務(wù)是怎么調(diào)用它了.首先把webservice的 項目編譯完成,假定我們這個服務(wù)是針對資源站點A的,我們不妨稱其為ServiceA.先單獨運行asmx文件,執(zhí)行GetSiteAData (string AssignName)方法,將提示你輸入?yún)?shù),你輸入要搜索的內(nèi)容,點確認,將返回給你一個XML數(shù)據(jù),并在ie上顯示出來,這就是你搜索到的內(nèi)容拉.
webservice傳遞的數(shù)據(jù)只能是序列化的數(shù)據(jù),典型的就是xml數(shù)據(jù),這里我們也只討論XML數(shù)據(jù)的傳輸.
有了一些對XML webservice的初步了解后,我們將切入正題,即是用一個具體的webservice事例的形式來講解具體的webservice用法,用具體的事例來講解一個概念我想怎么也要比單純的說理能讓人容易理解吧.
這里,我們將以一個簡單的分布式課件搜索系統(tǒng)為例來講解.使用VS2003為編譯環(huán)境,C#為語言,SqlServcer2000為數(shù)據(jù)庫.(這個例子來 源于一位網(wǎng)上朋友的文章的啟發(fā),覺得很能代表webservice的特點,就按那個想法做了這么個系統(tǒng)來示例了)
首先,明確我們要做什么.我們需要一個對客戶的接口,也就是個站點,我們把它稱做ServiceGatherSite,它是何種形式都無所謂,甚至它本身 并不需要數(shù)據(jù)庫,它只是提供給用戶一個查詢的接口,真正的服務(wù),普通用戶是不接觸到的.然后,這里我們還需要若干個提供服務(wù)的站點,我們可以稱它們?yōu)橘Y源 站,這里為簡單起見,假設(shè)有兩個資源站,分別叫WebSiteA,WebSiteB,它們可以是不對外公布的,只是為了豐富查詢數(shù)據(jù)而存在.后,是我們 需要關(guān)注的東西---資源站提供給ServiceGatherSite的服務(wù).兩個資源站,就有兩個服務(wù),我們稱為SiteAService和 SiteBService.兩個服務(wù)間沒有任何關(guān)系,內(nèi)部提供的方法也完全沒關(guān)聯(lián),只是需要把方法如何使用告訴ServiceGatherSite,意思 是,服務(wù)只提供查詢接口,返回的數(shù)據(jù)如何處理,服務(wù)本身并不管,全由使用服務(wù)的站點分配.
寫了這么多,算是簡要的介紹了下有關(guān)XML webservice的概念和我們這個例子的結(jié)構(gòu),下篇文章,我們將開始真正進入代碼的設(shè)計階段.
上篇文章介紹了些webservice的基本特性和我們例子的結(jié)構(gòu),這篇文章我們將開始具體的代碼編寫工作.
這個專題主要講述的是webservice,因此這里我們的代碼以Webservice相關(guān)為主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只將簡略介紹.
在VS2003中,開發(fā)一個webservice并不是件困難的事,首先,我們新建一個webservice項目(文件->新建->項目->C#->Web服務(wù)應(yīng)用程序)
建完這個工程,我們將看到一個叫Service1.asmx的文件,這就是webservice的標準文件,它也有UI的概念,不過我們一般不關(guān)注,因 此,我們查看其cs代碼文件.如果你什么都還沒做的話,將看見一個被注釋掉的helloworld的WebMethod,把注釋去掉,在運行,你就可以得 到簡單的webservice運行實例了.點擊"helloworld"將執(zhí)行其方法.顯然,這個函數(shù)對我們的意義只在于宏觀的了解了下web服務(wù)的寫 法.
下面,我們將開始具體介紹webservice的寫法.在代碼文件里,如果我們寫了一個函數(shù)后,希望此函數(shù)成為外部可調(diào)用的接口函數(shù),我們必須在函數(shù)上面 添上一行代碼[WebMethod(Description="函數(shù)的描述信息")],如果你的函數(shù)沒有這個申明,它將不能被用戶引用.如:
以下是引用片段:
[WebMethod(Description="簡單的方法")]
public string HelloWorld()
{
return "Hello World";
}
這個函數(shù)就是外部可調(diào)用的接口函數(shù),對用戶來說相當于一個API.如果某用戶在引用了這個服務(wù)后,他調(diào)用HelloWorld()方法,他就將獲得"HelloWorld"這個返回值.
看到這里,我們是不是發(fā)現(xiàn),其實webservice并不是那么的神秘,它也不過只是個接口,對我們而言,側(cè)重點依然是接口函數(shù)的編寫.下面,我將給出我們的例子所需要的接口函數(shù).
[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()) //如果執(zhí)行成功,存儲過程
{
cp.myData.EnforceConstraints=false; //不進行格式嚴格檢查
if((int)cp.GetReturnValue("@res")==-1)
{
string XML="";
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;
}
這是獲取資源站點信息的一個接口函數(shù).里面大部分的代碼,我想對于有一定ASP.NET基礎(chǔ)的朋友來說,都應(yīng)該是一看就明白,這里只說明下CStoreProc,這是我封裝的一個存儲過程類,主要功能是執(zhí)行各種類型的存儲過程.
細心的朋友可能會發(fā)現(xiàn)這個函數(shù)的返回類型似乎比較特殊,是個xml的文檔.我們在前面已經(jīng)說過,webservice只能傳輸序列化數(shù)據(jù),xml顯然滿足 條件,但比如hash表之類的非序列化數(shù)據(jù),是不能傳輸?shù)?xml使用為廣泛,而且考慮到跨平臺應(yīng)用,所以這里我們只以XML數(shù)據(jù)的傳輸來示例.
接上篇文章,我們先簡單解釋下GetSiteAData(string AssignName)函數(shù).
函數(shù)功能很簡單,只是要返回查詢結(jié)果,其數(shù)據(jù)格式是XmlDataDocument.當查詢失敗時(無匹配查詢結(jié)果),我們構(gòu)造一個xml,返回一個空記 錄.否則,我們把查詢后的dataset生成一個XmlDataDocument,接下來,由于該項目的需要,我加入了一個循環(huán),添加dataset里所 沒有的節(jié)點,站點名稱.在這之后,算是完成了一個符合我們期望格式的XML數(shù)據(jù)文檔,我們把它返回.
好了,webservice的方法函數(shù)介紹完了(這里還有個web服務(wù)方法,稍后介紹),接下來我們的任務(wù)是怎么調(diào)用它了.首先把webservice的 項目編譯完成,假定我們這個服務(wù)是針對資源站點A的,我們不妨稱其為ServiceA.先單獨運行asmx文件,執(zhí)行GetSiteAData (string AssignName)方法,將提示你輸入?yún)?shù),你輸入要搜索的內(nèi)容,點確認,將返回給你一個XML數(shù)據(jù),并在ie上顯示出來,這就是你搜索到的內(nèi)容拉.