我一直在尝试使用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