ваш класс User
должен быть помечен атрибутом DataContract
, а его методы - атрибутом DataMember
. Возможно, его также необходимо пометить как KnownType
в классе CompositeUser
, чтобы включить его в типы для службы. Вы можете сделать это так:
[DataContract]
[KnownType(typeof(User))]
public class CompositeUser
{
...
}
вы сможете определить причину проблемы по логам. Либо вы получите сообщение «невозможно сериализовать», в этом случае вам нужно будет добавить атрибут [DataContract]
, либо это будет «тип не ожидался», и в этом случае вам также потребуется добавить атрибут [KnownType]
Если вы включите трассировку в своем сервисе, вы сможете получить более подробную информацию о проблеме. Добавьте что-то вроде этого в файл конфигурации:
<configuration>
<system.diagnostics>
<trace autoflush="true"/>
<sources>
<source name="System.ServiceModel" switchValue="Verbose">
<listeners>
<add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\wcfLog.svcLog"/>
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
также настройка <serviceDebug includeExceptionDetailInFaults="True" />
позволит получить более подробную информацию об ошибке в исключении службы, что также может помочь.
EDIT
Из комментариев ниже кажется, что класс User
является классом, сгенерированным Linq to SQL. Я не думаю, что вы должны посылать этот класс по проводам. WCF имеет дело с сообщениями, не относящимися к сериализации типов с поведением, поэтому вы должны создать DTO, который представляет данные вашего класса User
, которые будут необходимы клиенту, и отправить это DTO из контракта на обслуживание. Даже если вы отправите класс User таким, какой он есть, при получении клиентом у него не будет контекста для подключения к БД.