2013-07-15 31 views
0

請原諒,如果這是一個重複的問題 - 我已經搜索,但沒有找到任何解釋我的問題。查詢使用LINQ到對象時出現WCF錯誤

我創建了一個ASP.NET網站。我有3層 - 數據訪問,業務,演示。我在整個使用實體框架時使用共享實體。

  • 介紹:UI
  • 業務:WCF服務
  • 數據訪問:代碼連接到數據庫(包含EF情況下,連接字符串)
  • 實體:的.edmx - EF實體。這些在所有3層共享。

我在WCF服務中遇到了一些奇怪的行爲,我無法理解。我原來的代碼在DAL中有一個函數,它查詢所有客戶的數據庫,並返回一個List。該服務比根據UI請求的內容進一步查詢該列表並向列表層返回列表。

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

當我調試的代碼,eveything工作得很好,但是當該服務試圖將CUSTLIST返回給客戶端,我得到這個錯誤:接收到對localhost/WCF/MyService的HTTP響應時發生錯誤。這可能是由於服務端點綁定不使用HTTP協議。這也可能是由於HTTP請求上下文被服務器中止(可能是由於服務關閉)。查看服務器日誌獲取更多詳細信

我改變了我的DAL到inclued整個查詢,我的WCF服務到這:

public List<customer> GetCustomersByState(string state) 
    { 
     contextManager contextDAL = new contextManager(); 
     List<Customer> custList = contextDAL.GetCustomers(state) 
     return custList; 
    } 

這工作得很好。我也試圖把整個查詢放在服務中(服務直接連接到上下文並獲得列表),並且工作得很好。所以基本上,我的問題是,爲什麼WCF服務不能返回使用Linq查詢對象的objetcs列表(DAL返回客戶列表,因此所有進一步查詢都是linq到對象)。它使用Linq to Entities(使用服務中的所有代碼)正常工作,並且工作正常,根本不需要查詢 - 只需獲取列表並將其返回即可。

對於冗長的帖子,我很抱歉,我試圖包括所有必要的細節......謝謝!

回答

0

經過多次試驗和錯誤,我發現它不是一個查詢問題,它是一個尺寸問題。儘管WCF服務過濾我的數據只返回一些記錄,但我猜想它保留了對其他數據的某種引用,因爲它存在太多數據。如果我在DAL上執行了部分過濾器,然後繼續在WCF層上過濾,出現與我最初嘗試返回相同數量的記錄,則它將返回該列表而不會出現問題。

我無法解釋爲什麼會發生這種情況,我對WCF瞭解不多,只是解釋了我爲解決此問題而採取的措施。

+1

您的DAL方法包含兩個其他對象 - 當您的原始WCF調用將客戶信息從該集合中取出時,它也將數據帶入相關對象中。這與WCF無關,順便說一下(超出了可調整的大小限制) - 根本原因是LINQ查詢。 – Tim

+0

這是有道理的。那麼,如何修復我的查詢以使其以原始方式工作?我需要與客戶一起傳遞的'包括'表。 – ploni

+1

您必須增加綁定的大小限制。如果你發佈你的配置文件(服務和客戶端),我可以告訴你如何去做,如果你不知道如何做。 – Tim