一: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>