<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      在 WebService 中使用屬性

      [摘要]在 WebService 中發布一個方法很簡單,只要將你要發布的方法用 System.Web.Services.WebMethodAttribute 屬性類來標識出就可以了,但是該屬性只能應用于方法...
      在 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




      日韩精品一区二区三区高清