Я пытался использовать клиент SilverLight для вызова службы ASP.Net WCF, которая выдаст Dictionary<string, object>
.
Это работало нормально, когда значения в словаре были простыми типами, такими как int
, string
или Guid
.
Однако теперь у меня есть сценарий, где мне нужно, чтобы одно из значений было массивом 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 было «Тип» System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, Версия = 2.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089], [System.Object, mscorlib, Версия = 2.0. 0.0, Culture = нейтральный, 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 было «Тип» System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, Версия = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [SilverlightApplication7.Web.ObjectHolder, SilverlightApplication7.Web, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null]] [] 'с именем контракта данных' ArrayOfArrayOfKeyValueOfstringObjectHolderWAwxSTlb: http://schemas.microsoft.com/2003/10/Serialization/Arrays' не ожидается. Добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных в DataContractSerializer. '. Пожалуйста, смотрите InnerException для более подробной информации.
Снова я играл с ServiceKnownType
для ObjectHolder
, ObjectHolder[]
и даже ObjectHolder[][]
, поскольку в исключении упоминается "ArrayOfArrayOfKeyValueOfstringObjectHolder
".
Решение пока не найдено.