在 WebService 中使用屬性

來源:互聯網
上載者:User

  在 WebService 中發布一個方法很簡單,只要將你要發布的方法用 System.Web.Services.WebMethodAttribute 屬性類來標識出就可以了,但是該屬性只能應用於方法而不能應用到屬性。該類的MSDN文檔可以見到(C#):
[AttributeUsage(AttributeTargets.Method)]
public sealed class WebMethodAttribute : Attribute
  那麼,如果我們需要將一個屬性也發布成一個Web方法,該如何做呢?在討論這個問題之前,先來看看為什麼我們需要發布屬性為一個Web方法?因為有人可能會這麼告訴你,你可以把你的屬性改寫成兩個對應的getXXXXX/setXXXXX方法來分別發布成WebMethod。哦,是的,這麼做看似可以達到目的,但是這樣做損害了我們的介面定義,使得我們無法享受屬性為我們所帶來的快樂(請不要問我是什麼快樂),其實最重要的一個原因就是無法完成對介面的實現了,此話怎講?且看下面代碼(C#):

public interface IDataService
{
    // 該屬性指示當前使用的是什麼資料庫系統(例如:MS-SQLServer、Orcale、IBM-DB2 等等)
    int DataProvider
    {
        get;
    }

    // 該方法執行一段指定的SQL指令碼,並返回其結果集
    System.Data.DataSet Execute(String sqlText);

    // 該方法將指定的資料集儲存到資料庫中
    void Update(System.Data.DataSet dataSet);
}

  現在我們寫一個 WebService 其需要實現 IDataService 介面,必須在該 WebService 中包含並發布該屬性。這時我們該怎麼辦?呵呵,且看

public class DataService : System.Web.Services.WebSerbice, IDataService
{
    ...

    public int DataProvider
    {
        [WebMethod(MessageName="GetDataProvider")]
        get
        {
            ...
        }
    }

    [WebMethod()]
    public System.Data.DataSet Execute(String sqlText)
    {
        ...
    }
}

  OK,大家看到了,將一個方法發布成Web方法是在其函數體前指定 WebMethod 屬性,而屬性則是在其get或set器之前指定 WebMethod 屬性,如果不指定屬性的 MessageName 屬性值,則發布的屬性的Web方法名將被置為get_XXXXX和set_XXXXX。

  在使用VS.net產生的 WebService 代理類(通過添加Web引用,Reference.cs)中的成員都是方法,因此需要手動修改代理類中的相關方法為屬性,例如上例的本地代理類的相關代碼看起來是這樣的:

[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 中使用屬性了。呵呵,快樂又重新回來了!

後話:
  在開發過程中,你可能需要經常發布新的方法到你的 WebService 頁面中,用戶端程式也需要同步更新 WebService 以獲得最新的介面,當用戶端重新整理 WebService 引用後你的代理類就會丟失你上面所作的修改。你可以維護一個用戶端代理類,並將這個代理類編譯到一個單獨的類庫中,而所有需要引用此 WebService 的用戶端就只需引用該類庫中的代理類了,這樣可以避免多個開發人員在每次更新 WebService 引用時的同步更改問題了,並且簡化了 WebService 的發布。當然,使用這種方式你需要認真考慮你的類庫版本以及命名空間的一些策略,這也是一件相當有趣並充滿藝術性的事情。
  另外,有關 WebService 頁面大小(包含方法個數)與效能的問題也需要我們給予足夠的關注,有關這方面的一個建議請參考我的這篇日誌:http://blog.csdn.net/sw515/archive/2004/07/20/46349.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.