Я пытаюсь получить список объектов от Платформы Объекта через WCF, но получаю следующее исключение:
Была ошибка при попытке сериализировать параметр http://tempuri.org/:GetAllResult. Сообщение InnerException было 'Типом 'Система. Данные. Объект. DynamicProxies. TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE' с данными сокращают имя 'TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE:http://schemas.datacontract.org/2004/07/System. Данные. Объект. DynamicProxies не ожидается. Рассмотрите использование DataContractResolver или добавьте, что любые типы, не известные статически списку известных типов - например, при помощи атрибута KnownTypeAttribute или путем добавления их к списку известных типов, передали DataContractSerializer'.. Дополнительную информацию см. в InnerException.
Я использовал WCF в прошлом, но никогда с Платформой Объекта. Я имею все свои объекты, сгенерированные через Платформу Объекта, и аннотируюсь [DataContract] и [DataMember] атрибуты. У меня нет Свойств Навигации ни на одном из моих объектов.
GetAll () называемый метод находится в классе реферативной службы:
[ServiceContract]
public interface IService
{
[OperationContract]
List GetAll();
}
И я использую ChannelFactory для вызова моей реализации:
Binding binding = new NetTcpBinding();
EndpointAddress endpointAddress = new EndpointAddress("net.tcp://localhost:8081/" + typeof(TestObjectService).Name);
using (ChannelFactory channel = new ChannelFactory(binding, endpointAddress))
{
ITestObjectService testObjectService = channel.CreateChannel();
testObjects = testObjectService.GetAll();
channel.Close();
}
Я размещаю его как таковой:
Type type = typeof(TestObjectService);
ServiceHost host = new ServiceHost(type,
new Uri("http://localhost:8080/" + type.Name),
new Uri("net.tcp://localhost:8081/" + type.Name));
host.Open();
При использовании отладки это находит объекты от базы данных, однако, это приводит возврат к сбою объектов.
Какие-либо идеи как, туда, где я могу идти не так, как надо?
Разобраться в этом было непросто, но это происходит потому, что EntityFramework создает "прокси" вашего класса. Класс TestObject у меня был настроен правильно, но он создавал класс под названием: TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE
Чтобы заставить ChannelFactory + WCF + Entity Framework работать вместе, вы должны пойти в конструктор Context и добавить следующее:
ContextOptions.ProxyCreationEnabled = false;
Надеюсь, это поможет кому-нибудь еще.