WebService中的方法是否允許重載

一:WebService中的方法是否允許重載?

例如:
[WebMethod]
   public string GetName()
  {
       return "從小就犯困";
  }
 
  [WebMethod]
  public string GetName(string strValue)
  {
    return strValue;
   }
會報錯。
二:爲什麼WebService中不支持方法的重載?
    WebService中不支持方法的重載,這還得從WebService的工作機制中說起,當客戶端調用一個WebService的方法時,首先要將方法名稱和需要傳遞的參數包裝成XML,也就是SOAP包,通過HTTP協議傳遞到服務器端,然後服務器端解析這段XML,得到被調用的方法名稱和傳遞過來的參數,進而調用WebService相應的方法,方法執行完畢後,將返回結果再次包裝爲XML,也就是SOAP響應,發送到客戶端,最後客戶端解析這段XML,最終得到返回結果,關鍵在於服務器端解析XML時無法識別重載的方法,WebService只認方法的名稱,而且兩個方法的名稱相同,服務器端不知道該調用哪個相應的方法

三:如何解決WebService中方法的重載?
    (1)將類的WebServiceBinding屬性中ConformsTo指定爲WsiProfiles.None
    (2)可以通過MessageName屬性消除由於多個相同的名稱造成的Web服務無法識別的問題,因爲MessageName屬性使得Web服務能夠確定唯一別名的重載方法,默認時候是方法本身的名稱,當指定MessageName屬性後,SOAP將反映MessageName的值,而不是方法名稱本身,所以這就解決了WebService中不支持方法的重載

     代碼1:[WebServiceBinding(ConformsTo = WsiProfiles.None)]
   代碼2:[WebMethod(MessageName="FirstMethod")]
   public string GetName()
   {
       return "從小就犯困";
   }
 
   [WebMethod(MessageName="SecondMethod")]
   public string GetName(string strValue)
   {
    return strValue;
   }
四、webservice如何直接用DataSet、DataTable、DataRow作爲返回類型?
需要在Web.config文件添加序列化轉換器的屬性,示例代碼:

<system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization>
          <converters>
            <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview"/>
            <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview"/>
            <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview"/>
          </converters>
        </jsonSerialization>
      </webServices>
    </scripting>
</system.web.extensions>


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章