Привет всем,
У меня есть подобная иерархия классов:
Здесь два класса наследуются от одного предка (A). Причем один из наследников (C) содрежит массив элеметов A.
Другой интересный момент, класс B имеет свойство типа Object, который должен содержать простые типы, на всякий случай я их в KnownTypes добавил.
[DataContract]
[KnownType("KnownTypes")]
public class A {
[DataMember]
public String Prop1 { get; set; }
static Type[] KnownTypes() {
return new Type[] {
typeof(B),
typeof(C)
};
}
}
[DataContract]
[KnownType("KnownTypes")]
public class B : A
{
[DataMember]
public Object Prop2 { get; set; }
static Type[] KnownTypes() {
return new Type[] {
typeof(String),
typeof(Int32),
typeof(Decimal),
typeof(Boolean),
typeof(DateTime),
typeof(Guid)
};
}
}
[DataContract]
public class C : A
{
[DataMember]
public A[] Children { get; set; }
}
Сервис имеет подобный метод:
public void MyMethod(A a)
{
// ...
}
На стороне клиента сгенерированны проки классы. Создаются эксемпляры или B или С класса и вызывается метод сервиса MyMethod( b /* или с */).
Вызов до сервиса не доходит, и операция через некоторое время обрывается по таймауту.
Вопрос собственно, почему не доходит запрос? Или это иерархия классов, или нельзя использовать тип объект в классе B?
Надо сказать, что если я использую свойство типа объект в простом классе (без наследования), то запросы с этип типом доходят до сервиса, и он их успешно десериализирует.
Здравствуйте, Аноним, Вы писали:
А>Вопрос собственно, почему не доходит запрос?
На сервере (и клиенте) в конфиг добавьте:
<system.serviceModel>
<diagnostics>
<messageLogging maxMessagesToLog="30000" logEntireMessage="true" logMessagesAtServiceLevel="true" logMalformedMessages="true" logMessagesAtTransportLevel="true">
</messageLogging>
</diagnostics>
</system.serviceModel>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Verbose">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="trace.xml" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
Полученный trace.xml открывайте \Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcTraceViewer.exe и смотрите причину.
Спасибо за указание способа трасировки сообщений. То что нужно в хозяйстве.
Обнаружилась причина (вольный перевод):
Ошибка десериализации параметра ..имя_параметра.. Внутреняя ошибка "граф объектов для типа "С" содержит циклы и не может быть сериализован, если отслеживание ссылок отключено.". Для получения дополнительной информации см. раздел "InnerException".
Вот собственно вопрос, как включить отслеживание ссылок?