1. 返回自定義class,但實際返回的倒是DataSet,即便實現了IxmlSerializable。
自定義了一個
class
,因爲
WebService
須要對
class
進行
xml
序列化,因此實現了
IxmlSerializable
接口,可是在客戶端調用調試的時候,卻發現服務返回值不是自定義的
class
,而是一個
dataset
或者
dataset[]
。通過檢驗,致使如此結果發現仍是在序列化的過程當中出現了問題。在實現
IxmlSerializable
的時候,使用
XmlWriter
進行
tree
結構的序列化,而後使用
XmlReader
進行反序列化,
CLR
會把這個
tree
結構認爲是
DataSet
序列化的結果,因此在反序列化的時候
.CLR
會把反序列化的結果轉爲
DataSet
。
若是要用
IxmlSerializable
實現自定義
class
的返回,最好使用
xml
架構文件進行驗證,這樣就能夠實現返回的是一個
class
而不是
DataSet(
該例子能夠在
msdn
上找到
)
。
2. 沒法返回自定義class,即便對class申明瞭[Serializable]。
因爲使用
IxmlSerializable
進行返回自定義
class
會比較麻煩,因此改用了
[Serializable]
進行實現。可是在實際中依然沒法返回
class
。怎麼回事呢?後來才發現,漏寫了一個無參構造函數。在
.NET
開發
Web Service
中,序列化機制須要調用一個無參構造函數來序列化和反序列化對象,並且這個無參構造函數最好顯式聲明。記得在
.NET1.1
下的時候,沒有顯式申明無參構造函數的時候會出現異常提示,可是在
.NET2.0
之後卻沒有了。
在顯示聲明無參構造函數後,能夠返回自定義
class
了,可是有些
public
屬性依然沒法進行序列化。怎麼回事呢?原來對於只有
get
功能的屬性,
.NET
的
[Serializable]Attribute
的序列化機制依然沒法對之進行序列化
。可是在實際狀況中,
class
的一些字段只能是
get
不能是
set
,該如何解決?
3. 序列化只有get功能的public property
對於只有
get
功能的
public property
,解決的最簡單的方法就是定義個
set
空實現。即
public string Air
{
get{retrun _air;}
set{}
}
4. 沒法進行遠程調試。
在默認狀況下,
VS05
之後上開發的
Web Servcie
默認狀況下是不支持遠程調試的。在調試頁面上會顯示以下信息:
對於該問題,只須要在
Web.config
文件中的
<system.web>
節點下加入以下信息:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
<add name="HttpSoap"/>
<add name="Documentation"/>
</protocols>
</webServices>
其中的
<
protocols >
節點指定了
ASP.NET Web
服務可用來接收從客戶端發送來的請求數據和返回響應數據的協議。
5.部署的時候出現"服務器應用程序不可用"
Web Service是用VS2008開發的,使用了LINQ TO XML和LINQ TO SQL,可是部署機子上是.NET2.0的環境,因此在服務器上裝了.NET 3.5的Framework。測試的時候,卻出現了「服務器應用程序不可用」。這個錯誤貌似在ASP.NET部署的時候常見問題。先使用 aspnet_regiis進行從新註冊,可是錯誤依舊。後來,對虛擬目錄指向的程序文件夾加入以下用戶問題獲得解決:
ASP.NET IIs_WPG Internet來賓賬戶 System