使用LINQ to Objects进行查询时出现WCF错误
本文关键字:WCF 错误 查询 LINQ to Objects 使用 | 更新日期: 2023-09-27 18:22:26
如果这是一个重复的问题,请原谅——我已经搜索过了,但没有找到任何解释我问题的东西。
我创建了一个ASP.NET网站。我有三层——数据访问、业务、演示。我在使用实体框架的整个过程中使用了共享实体。
- 演示文稿:UI
- 业务:WCF服务
- 数据访问:连接到DB的代码(包含EF上下文、连接字符串)
- 实体:.edmx-EF实体。这些在所有3层中都是共享的
我在WCF服务中遇到了一些我无法理解的奇怪行为。我最初的代码在DAL中有一个函数,它为所有客户查询数据库,并返回一个List。该服务根据UI的请求进一步查询了该列表,并向Presentation Layer返回了一个列表。
DAL:
public List<Customer> GetCustomers()
{
List<Customer> custList= new List<Customer>();
try
{
using (NorthWindsEntities context = new NorthWindsEntities(connectionString))
{
custList= context.Customers
.Include("Orders")
.Include("OrderDetails")
.ToList();
}
return custList;
}
catch (Exception ex)
{
//handle exception
return custList;
}
}
WCF:
public List<Customer> GetCustomersByState(string state)
{
contextManager contextDAL = new contextManager();
List<Customer> custList = contextDAL.GetCustomers()
.Where(c => c.State == state)
.ToList();
return custList;
}
当我调试代码时,一切都很好,但当服务试图将custList返回到客户端时,我得到了以下错误:在接收到对localhost/WWC/MyService的HTTP响应时出错。这可能是由于服务端点绑定未使用HTTP协议。这也可能是由于服务器中止了HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。
我将我的DAL更改为包含整个查询,并将我的WCF服务更改为:
public List<customer> GetCustomersByState(string state)
{
contextManager contextDAL = new contextManager();
List<Customer> custList = contextDAL.GetCustomers(state)
return custList;
}
这很好。我还尝试将整个查询放在服务中(服务直接连接到上下文并获得列表),这也很好。
所以,基本上,我的问题是,为什么WCF服务不能返回使用Linq-to-Objects查询的对象列表(DAL返回一个客户列表,所以所有进一步的查询都是Linq-to-Objects)。使用Linq-to-Entities(使用服务中的所有代码)可以很好地工作,而且完全不需要查询,只需要获取列表并返回即可。
我很抱歉发了这么长的帖子,我试图包括所有必要的细节。。。谢谢
经过多次尝试和错误,我发现这不是一个查询问题,而是一个大小问题。尽管WCF服务过滤了我的数据,只返回了一些记录,但我想它保留了对其余数据的某种引用,因为它错误地处理了太多数据。如果我在DAL上进行部分筛选,然后继续在WCF层上进行筛选,得到与我最初试图返回的记录数量相同的记录,它会毫无问题地返回列表。
我无法解释为什么会发生这种情况,我对WCF了解不多,只是解释了我做了什么来避免其他人出现这种问题。