我是wcf的新手,我有一个简单的问题。
我使用EF和WCF服务。从WinForms应用程序调用WCF服务。我希望从WCF获得简单的List。当我从wcf测试控制台调用AllVisitors()时,我得到下一个错误:
无法调用该服务。可能的原因:服务处于脱机状态 或无法进入;客户端配置与 代理;现有代理无效。请参阅堆栈跟踪 更多详情。您可以尝试通过启动新代理进行恢复,然后进行恢复 默认配置或刷新服务。
在跟踪日志中,我会看到下一个例子:
尝试序列化参数时出错 http://tempuri.org/:AllVisitorsResult。 InnerException消息是 '类型 ' System.Data.Entity.DynamicProxies.Visitor_4E7A6F28B7631289C58E0883F6BDF681C78B7180EA3E530CDFE420CAA3C15645' 与数据合同名称 Visitor_4E7A6F28B7631289C58E0883F6BDF681C78B7180EA3E530CDFE420CAA3C15645:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' 不是预期的。考虑使用DataContractResolver或添加任何 静态地知道已知类型列表的类型 - 例如, 通过使用KnownTypeAttribute属性或将它们添加到 传递给DataContractSerializer的已知类型列表。
这是我的代码:
[ServiceContract]
public interface IServiceVisit
{
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedResponse)]
List<Visitor> AllVisitors();
}
[DataContract]
[KnownType(typeof(Visitor))]
[KnownType(typeof(Visit))]
[KnownType(typeof(ICollection<Visit>))]
public class ServiceVisit : IServiceVisit
{
public List<Visitor> AllVisitors()
{
using (TurnstileDbEntities te = new TurnstileDbEntities())
{
return te.Visitors.ToList<Visitor>();
}
}
}
当我尝试返回List<Visitor>
时,该方法失败。但是当我返回一个原始类型时,该方法完全正常。如int,decimal,string ......等。
此处访问者和访问自动生成的模型:
public partial class Visitor
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Visitor()
{
this.Visits = new HashSet<Visit>();
}
public int Id { get; set; }
public int PermitId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
public bool IsValid { get; set; }
public System.DateTime RegistrationDate { get; set; }
public byte[] Picture { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Visit> Visits { get; set; }
}
public partial class Visit
{
public int Id { get; set; }
public int VisitType { get; set; }
public System.DateTime VisitDate { get; set; }
public Nullable<int> Visitor_Id { get; set; }
public virtual Visitor Visitor { get; set; }
}
我知道List<>
填充了数据。我知道数据的大小可能很大,因为byte [] Picture包含二进制数据(图像)。
访客也与访问有关。
据我所知,问题出在序列化和生成的动态代理中,其名称如下:Visitor_4E7A6F28B7631289C58E0883F6BDF681C78B7180EA3E530CDFE420CAA3C15645。但也许我错了。
那么,我该如何解决这个问题以及我做错了什么?我发现这个问题经常讨论。但无法为我找到解决方案。
答案 0 :(得分:0)
因此,解决方法是设置ProxyCreationEnabled = false
public List<Visitor> AllVisitors()
{
using (TurnstileDbEntities te = new TurnstileDbEntities())
{
te.Configuration.ProxyCreationEnabled = false;
return te.Visitors.ToList<Visitor>();
}
}