我一直在嘗試使用SilverLight客戶端來調用返回Dictionary<string, object>
的ASP.Net WCF服務。 當字典中的值是簡單類型如int
,string
或Guid
時,它工作正常。WCF服務返回字典數組字符串<string,object>
但是,我現在有一個場景,我需要其中一個值爲Dictionary<string, object>
的數組!這一切都編譯好,服務的簽名沒有改變,但現在服務調用失敗。
任何想法如何解決它?我試圖使用KnownType
和ServiceKnownType
屬性註釋我的服務類和方法,但這不起作用。
下面是一段代碼:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
[OperationContract]
[ServiceKnownType(typeof(Dictionary<string, object>))]
public Dictionary<string, object> GetObject()
{
return new Dictionary<string, object>()
{
{ "pty1", 1 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blah" },
{ "pty4", new Dictionary<string, object>[]
{
new Dictionary<string, object>()
{
{ "pty1", 4 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blah" },
}
,
new Dictionary<string, object>()
{
{ "pty1", 4 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blahblah" },
}
}
}
};
}
}
謝謝您的解答。我已經打開WCF跟蹤,並懷疑在序列化過程中出現問題。 問題不在於Dictionary<string, object>
的序列號,而是Array
的Dictionary<string, object>
的序列號。
這裏是WCF服務記錄的異常。
嘗試序列化參數:GetObjectResult時發生錯誤。 InnerException消息是'Type'System.Collections.Generic.Dictionary`2 [[System.String,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Object,mscorlib,Version = 2.0。 0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] []'與數據協定名稱'ArrayOfArrayOfKeyValueOfstringanyType:http://schemas.microsoft.com/2003/10/Serialization/Arrays'不是預期的。將任何未知的靜態類型添加到已知類型列表中 - 例如,使用KnownTypeAttribute屬性或將它們添加到傳遞給DataContractSerializer的已知類型列表中。有關更多詳細信息,請參閱InnerException。
我也嘗試用單個數據成員來定義一個新的DataContract
類,但它導致了非常相同的錯誤。
下面是該代碼,然後是由WCF日誌記錄記錄的異常。
[DataContract]
[KnownType(typeof(ObjectHolder))]
public class ObjectHolder
{
[DataMember]
public object Object { get; private set; }
public ObjectHolder(object obj)
{
this.Object = obj;
}
}
而試圖序列參數時出現錯誤:GetObjectResult。 InnerException消息是'Type'System.Collections.Generic.Dictionary`2 [[System.String,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[SilverlightApplication7.Web.ObjectHolder,SilverlightApplication7.Web,版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null]] []'與數據協定名稱'ArrayOfArrayOfKeyValueOfstringObjectHolderWAwxSTlb:http://schemas.microsoft.com/2003/10/Serialization/Arrays'不是預期的。將任何未知的靜態類型添加到已知類型列表中 - 例如,使用KnownTypeAttribute屬性或將它們添加到傳遞給DataContractSerializer的已知類型列表中。有關更多詳細信息,請參閱InnerException。
再次我打了ServiceKnownType
爲ObjectHolder
,ObjectHolder[]
甚至ObjectHolder[][]
因爲除了提到的「ArrayOfArrayOfKeyValueOfstringObjectHolder
」。
還沒有解決方案呢。
您收到什麼錯誤? – 2010-01-29 05:24:56
我的猜測是WCF可能會麻煩串行化對象。如果可行,你可以嘗試製作你的字典。 –
sipwiz
2010-01-29 05:38:30
我同意sipwiz,你會有麻煩序列化字典。你應該讓Dictionary包含一個可序列化的對象(這意味着你需要通過Dictionary –
srodriguez
2010-01-29 05:54:29