這個專題主要講述的是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 數據傳輸.
新聞熱點
疑難解答