我创建了WCF服务,该服务从实体框架工作模型返回产品实体的集合。该产品具有自引用。我在Silverlight应用程序中使用来自WCF服务的数据。 我使用异步方法。产品实体以这种形式建模:
Public partial class Product
{
Public Product(){
this.product_11=new HashSet<Product>;
}
[DataMember]
public int Id{get; set;}
[DataMember]
public Nullable<int> subPro{get; set;}
[DataMember]
Public virtual Icollection<Product> product_11{get; set;}
[DataMember]
Public virtual Product product_12{get; set;}
}
我在服务方法中使用它
productEntity ef=new productEntity();
[OperationContract]
Public IEnumerable<Product> Getproduct()
{
return ef.Product;
}
在运行时通过呼叫服务方法我得到超时错误
“HTTP请求已超出分配的超时时间”
答案 0 :(得分:1)
我认为问题在于将IQueryable与WCF服务结合使用作为返回类型。
[OperationContract]
Public IEnumerable<Product> Getproduct()
{
return ef.Product.ToList();
}
在这种情况下,查询是在调用ToList()
方法的情况下执行的,因此WCF不会执行IQueryable。
第二部分是,从上下文返回模型的对象时,可能会遇到序列化问题。因为EF通过继承将延迟加载的特性注入到模型类中。
您应该在服务方法中关闭当前上下文的延迟加载:
context.ContextOptions.LazyLoadingEnabled = false;
context.ContextOptions.ProxyCreationEnabled = false;
此link
中对此进行了描述接下来的事情是,将模型类转换为XML消息的序列化程序在循环引用方面存在问题。这是一个可能导致问题的例子:
public class A
{
public string PropA { get; set; }
public virtual B PropB { get; set; }
}
public class B
{
public string PropC { get; set; }
public virtual A PropD { get; set; }
}
您可以使用CyclicReferencesAware
方法的OperationContract
属性来避免这种情况:
[OperationContract]
[CyclicReferencesAware(true)]
Public IEnumerable<Product> Getproduct()
{
return ef.Product.ToList();
}
希望这能帮到你!