当我运行我的服务时,我得到了例外:
服务器在处理请求时遇到错误。异常消息是'无法序列化System.Data.Entity.DynamicProxies.Cosik_14C2类型的参数...'(对于操作'GetCosik',合同'ICosikService'),因为它不是确切的类型'Project.Domain.Entities.Cosik '在方法签名中并且不在已知类型集合中。为了序列化参数,请使用ServiceKnownTypeAttribute将类型添加到操作的已知类型集合中。有关详细信息,请参阅服务器日志。
我是WCF服务和实体框架的新手,我很感激任何帮助/建议。
我正在使用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;
}
我实现了在http://msdn.microsoft.com/en-us/library/ee705457.aspx上给出的ApplyDataContractResolverAttribute类,并在GetCosik方法中添加了[ApplyDataContractResolver]注释。但是,它没有帮助。
有什么建议我错过了吗?
答案 0 :(得分:4)
而不是开发自定义解析器,而不是关闭代理创建。代理不适用于像WCF这样的场景,因为在序列化期间无论如何都必须关闭延迟加载,并且永远不会使用动态更改跟踪:
context.Configuration.ProxyCreationEnabled = false;