在 WebService 中使用屬性
發(fā)表時間:2023-08-19 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在 WebService 中發(fā)布一個方法很簡單,只要將你要發(fā)布的方法用 System.Web.Services.WebMethodAttribute 屬性類來標(biāo)識出就可以了,但是該屬性只能應(yīng)用于方法...
在 WebService 中發(fā)布一個方法很簡單,只要將你要發(fā)布的方法用 System.Web.Services.WebMethodAttribute 屬性類來標(biāo)識出就可以了,但是該屬性只能應(yīng)用于方法而不能應(yīng)用到屬性。該類的MSDN文檔可以見到(C#):
[AttributeUsage(AttributeTargets.Method)]
public sealed class WebMethodAttribute : Attribute
那么,如果我們需要將一個屬性也發(fā)布成一個Web方法,該如何做呢?在討論這個問題之前,先來看看為什么我們需要發(fā)布屬性為一個Web方法?因為有人可能會這么告訴你,你可以把你的屬性改寫成兩個對應(yīng)的getXXXXX/setXXXXX方法來分別發(fā)布成WebMethod。哦,是的,這么做看似可以達(dá)到目的,但是這樣做損害了我們的接口定義,使得我們無法享受屬性為我們所帶來的快樂(請不要問我是什么快樂),其實最重要的一個原因就是無法完成對接口的實現(xiàn)了,此話怎講?且看下面代碼(C#):
public interface IDataService
{
// 該屬性指示當(dāng)前使用的是什么數(shù)據(jù)庫系統(tǒng)(例如:MS-SQLServer、Orcale、IBM-DB2 等等)
int DataProvider
{
get;
}
// 該方法執(zhí)行一段指定的SQL腳本,并返回其結(jié)果集
System.Data.DataSet Execute(String sqlText);
// 該方法將指定的數(shù)據(jù)集保存到數(shù)據(jù)庫中
void Update(System.Data.DataSet dataSet);
}
現(xiàn)在我們寫一個 WebService 其需要實現(xiàn) IDataService 接口,必須在該 WebService 中包含并發(fā)布該屬性。這時我們該怎么辦?呵呵,且看
public class DataService : System.Web.Services.WebSerbice, IDataService
{
...
public int DataProvider
{
[WebMethod(MessageName="GetDataProvider")]
get
{
...
}
}
[WebMethod()]
public System.Data.DataSet Execute(String sqlText)
{
...
}
}
OK,大家看到了,將一個方法發(fā)布成Web方法是在其函數(shù)體前指定 WebMethod 屬性,而屬性則是在其get或set器之前指定 WebMethod 屬性,如果不指定屬性的 MessageName 屬性值,則發(fā)布的屬性的Web方法名將被置為get_XXXXX和set_XXXXX。
在使用VS.net生成的 WebService 代理類(通過添加Web引用,Reference.cs)中的成員都是方法,因此需要手動修改代理類中的相關(guān)方法為屬性,例如上例的本地代理類的相關(guān)代碼看起來是這樣的:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(... ...)]
[return: System.Xml.Serialization.XmlElementAttribute("GetDataProviderResult")]
public int GetDataProvider()
{
object[] results = this.Invoke("GetDataProvider", new object[0]);
return (int)results[0];
}
那么,你只需將該方法的主體部分大概改成這個樣子即可:
public int GetDataProvider
{
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(... ...)]
[return: System.Xml.Serialization.XmlElementAttribute("GetDataProviderResult")]
get
{
object[] results = this.Invoke("GetDataProvider", new object[0]);
return (int)results[0];
}
}
通過以上步驟就可以在 WebService 中使用屬性了。呵呵,快樂又重新回來了!
后話:
在開發(fā)過程中,你可能需要經(jīng)常發(fā)布新的方法到你的 WebService 頁面中,客戶端程序也需要同步更新 WebService 以獲得最新的接口,當(dāng)客戶端刷新 WebService 引用后你的代理類就會丟失你上面所作的修改。你可以維護(hù)一個客戶端代理類,并將這個代理類編譯到一個單獨的類庫中,而所有需要引用此 WebService 的客戶端就只需引用該類庫中的代理類了,這樣可以避免多個開發(fā)人員在每次更新 WebService 引用時的同步更改問題了,并且簡化了 WebService 的發(fā)布。當(dāng)然,使用這種方式你需要認(rèn)真考慮你的類庫版本以及命名空間的一些策略,這也是一件相當(dāng)有趣并充滿藝術(shù)性的事情。
另外,有關(guān) WebService 頁面大。ò椒▊數(shù))與性能的問題也需要我們給予足夠的關(guān)注,有關(guān)這方面的一個建議請參考我的這篇日志:http://blog.csdn.net/sw515/archive/2004/07/20/46349.aspx