Сериализация POCO прокси с WCF - PullRequest
5 голосов
/ 18 января 2012

При запуске службы я получил исключение:

Сервер обнаружил ошибку при обработке запроса.Сообщение об исключении: «Невозможно сериализовать параметр типа System.Data.Entity.DynamicProxies.Cosik_14C2 ...» (для операции «GetCosik», контракт «ICosikService»), поскольку он не является точным типом «Project.Domain.Entities.Cosik».'в сигнатуре метода и отсутствует в коллекции известных типов.Чтобы сериализовать параметр, добавьте тип в коллекцию известных типов для операции, используя ServiceKnownTypeAttribute. '.Смотрите подробности в журналах сервера.

Я новичок в службах WCF и Entity Framework и буду признателен за любую помощь / предложения.

Я использую Entity Framework 4.1.Используя сначала код, я создал базу данных с двумя таблицами:

[DataContract(IsReference=true)]
public class Cosik
{
    [DataMember]
    public int cosikID { get; set; }

    [DataMember]
    public string title { get; set; }

    [DataMember]
    public int DifficultyID { get; set; }
    [DataMember]
    public virtual Difficulty Difficulty { get; set; }
}

[DataContract(IsReference=true)]
public class Difficulty
{
    [DataMember]
    public int DifficultyID { get; set; }

    [DataMember]
    [Required]
    public string NameToDisplay { get; set; }
}

Затем я создал приложение службы WCF и сделал его RESTful.Ниже приведен код для интерфейса:

[ServiceContract]
public interface ICosikService
{
    [OperationContract]
    [ApplyDataContractResolver]
    [WebGet(UriTemplate = "/cosik")]
    Cosik GetCosik();
}

и реализация этого контракта

public class RecipeService : IRecipeService
{
//repository of Cosik entities - stores collection of all
//Cosik entities that can be queried from DB
private ICosikRepository cosikRepo;
...

public Cosik GetCosik()
    {
        Cosik c = cosikRepo.GetById(1);
        return c;
    }

Я реализовал класс ApplyDataContractResolverAttribute, указанный в: http://msdn.microsoft.com/en-us/library/ee705457.aspx, и добавил аннотацию [ApplyDataContractResolver] в GetCosikметод.Однако это не помогло.

Любое предложение, что я пропустил?

1 Ответ

4 голосов
/ 18 января 2012

Вместо разработки собственного распознавателя отключите создание прокси.Прокси-серверы не предназначены для таких сценариев, как WCF, поскольку отложенная загрузка в любом случае должна быть отключена во время сериализации, а динамическое отслеживание изменений никогда не используется:

context.Configuration.ProxyCreationEnabled = false;
...