0

如果这是一个重复的问题,请原谅 - 我已经搜索但没有找到任何可以解释我的问题的东西。

我创建了一个 ASP.NET 网站。我有 3 层 - 数据访问、业务、演示。我在整个使用实体框架的过程中都使用了共享实体。

  • 演示:用户界面
  • 业务:WCF服务
  • 数据访问:连接数据库的代码(包含 EF 上下文、连接字符串)
  • 实体:.edmx - EF 实体。这些在所有 3 层中共享。

我在 WCF 服务中遇到了一些我无法理解的奇怪行为。我的原始代码在 DAL 中有一个函数,它为所有客户查询数据库,并返回一个列表。该服务然后根据 UI 请求的内容进一步查询此列表,并将列表返回给表示层。

达尔:

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;
        }
    } 

周转基金:

 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/WCF/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(包含服务中的所有代码)可以正常工作,并且完全无需查询即可正常工作 - 只需获取一个列表并返回它。

很抱歉这篇冗长的帖子,我试图包括所有必要的细节......谢谢!

4

1 回答 1

0

经过反复试验,我发现这不是查询问题,而是大小问题。尽管 WCF 服务正在过滤我的数据以仅返回几条记录,但我猜它保留了对其余数据的某种引用,因为它错误地处理了太多数据。如果我在 DAL 上进行部分过滤,然后继续在 WCF 层上进行过滤,得到与我最初尝试返回的相同数量的记录,它会毫无问题地返回列表。

我无法解释为什么会发生这种情况,我对 WCF 了解不多,只是解释我做了什么来解决它,以防其他人遇到这个问题。

于 2013-07-15T17:28:57.247 回答