2009-10-26 29 views
1

我有一個Silverlight啓用WCF服務Silverlight應用程序。該服務傳遞一個帶有少量字符串屬性的小POCO類,以及該類中定義的一個枚舉的列表> <>。使用ASP.NET開發服務器運行時一切正常,但是當我將服務移動到IIS服務器(Windows 2003)時,當我嘗試瀏覽.svc文件時出現以下錯誤:部署Silverlight的WCF服務,IIS服務器提供了錯誤「考慮與DataContractAttribute標記」

類型'MyProject.Web.MyClass'不能是 序列化。考慮 標誌着它的DataContractAttribute屬性, 和標記所有成員的你 要系列化與 DataMemberAttribute屬性。

即使它在工作的開發方面,我已經嘗試添加裝飾......但迄今沒有效果。

任何想法,什麼可能導致開發工作站和服務器之間的結果的這種差異?

回答

1

確保(1).NET Framework 3.5 SP1安裝在服務器上,並且(2)網站以ASP.Net 2.0模式運行,而不是1.1模式。

Web Platform Installer是安裝更新的框架,如果尚未安裝的簡便方法。

+0

謝謝。它是需要.NET Framework 3.5的SP1。從MSDN站點獲得關於SP1的好處 - 「讓開發人員更好地控制他們訪問數據和服務的方式的WCF改進」簡化了客戶端應用程序的安裝體驗「 – Feckmore 2009-10-27 13:01:18

+0

不確定我同意您對WPI - *的評論每次我使用它沒有給出理由,安裝失敗。這是至少6倍 – tomfumb 2011-08-12 23:05:35

1

您的數據元素(POCO類)應該標記爲WCF的DataContracts,以便WCF明確知道它需要序列化以通過線路發送。

相反的XML序列化,DataContractSerializer的WCF中使用了「選入」模型 - 任何東西都不會被忽略 - 只是你明確馬克作爲[DataContract][DataMember]將被序列化的東西。

[DataContract] 
class YourPocoClass 
{ 
    [DataMember] 
    private int _ID; 

    [DataMember] 
    string CustomerName { get; set; } 

    public decimal CustomerOrderAmount { get; set; } 
} 

在這個例子中,從YourPocoClass,你就會有兩個_ID場和CustomerName財產被序列化到WCF消息 - 但CustomerOrderAmount被序列化 - public與否。因此,最佳做法是:用[DataContract](對於類)和[DataMember](對於每個成員在該類內部發送)明確標記需要在WCF中發送的所有複雜類型。

Marc

+0

爲什麼在沒有裝飾的情況下序列化就會很好? – Feckmore 2009-10-27 12:21:02

+0

這是一個已經引入的「簡化」,但它似乎只能工作一半時間。明確地做 - 這更容易,並更清楚地陳述你的意圖。 – 2009-10-27 12:33:15

+0

+1 Marc,非常感謝您的幫助。我給了科比公認的答案,因爲他非常具體地回答了我遇到的問題的原因,但我非常感謝您對最佳做法的建議和澄清。謝謝! – Feckmore 2009-10-27 13:03:28