当方法返回List <t>

时间:2016-06-01 09:59:06

标签: c# wcf

我是wcf的新手,我有一个简单的问题。

我使用EF和WCF服务。从WinForms应用程序调用WCF服务。我希望从WCF获得简单的List。当我从wcf测试控制台调用AllVisitors()时,我得到下一个错误:

  

无法调用该服务。可能的原因:服务处于脱机状态   或无法进入;客户端配置与   代理;现有代理无效。请参阅堆栈跟踪   更多详情。您可以尝试通过启动新代理进行恢复,然后进行恢复   默认配置或刷新服务。

在跟踪日志中,我会看到下一个例子:

  

尝试序列化参数时出错   http://tempuri.org/:AllVisitorsResult。 InnerException消息是   &#39;类型   &#39; System.Data.Entity.DynamicProxies.Visitor_4E7A6F28B7631289C58E0883F6BDF681C78B7180EA3E530CDFE420CAA3C15645&#39;   与数据合同名称   Visitor_4E7A6F28B7631289C58E0883F6BDF681C78B7180EA3E530CDFE420CAA3C15645:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies&#39;   不是预期的。考虑使用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。但也许我错了。 那么,我该如何解决这个问题以及我做错了什么?我发现这个问题经常讨论。但无法为我找到解决方案。

1 个答案:

答案 0 :(得分:0)

因此,解决方法是设置ProxyCreationEnabled = false

    public List<Visitor> AllVisitors()
    {

        using (TurnstileDbEntities te = new TurnstileDbEntities())
        {
            te.Configuration.ProxyCreationEnabled = false;
            return te.Visitors.ToList<Visitor>();
        }
    }