天天看點

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>
           

繼續閱讀