2016-04-27 15 views
-2

這個錯誤,當我從服務器檢索20多萬條記錄的客戶,我得到這個錯誤:我得到的WCF

The underlying connection was closed: A connection that was expected to be kept alive was closed by the server.

什麼錯嗎?

+2

錯誤似乎很清楚 - 您是否爲每個數據庫請求打開連接或長時間保持連接並重新使用它? –

+0

沒有看到你的代碼,這將更像猜測我們,但這裏是一個想法..如果你正在創建與'使用(SqlConnection sqlConn =新的SqlConnection)的連接){}'例如,如果你嘗試連接在超出範圍時訪問sqlConn對象,並且連接不是全局的,它將被關閉等等。嘗試向我們展示實際問題出現的代碼,這意味着您需要設置斷點並使用調試器遍歷代碼。 – MethodMan

回答

0

許多事情都可能導致WCF中的這個問題。最好的解決方法是定義添加跟蹤日誌。下面的代碼添加到您的配置文件,以積極跟蹤:

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel" 
      switchValue="Information, ActivityTracing" 
      propagateActivity="true"> 
     <listeners> 
     <add name="traceListener" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="e:\path_tolog\WebTrace.svclog" /> <-- Path to the log file 
     </listeners> 
    </source> 
    </sources> 
</system.diagnostics> 
0

正如其他人所說,沒有看到任何代碼,我們只能猜測,但是,試圖跨越WCF發送一個未枚舉查詢時,我看到了類似的問題。

舉例來說,如果你有類似的信息(警告:空氣代碼)這個..

var data = ctx.Customers.Where(c => c.CustType == 1); 

...你嘗試從WCF服務方法返回此,你會得到異常你提到。這是因爲查詢已建立,併發送到WCF進行序列化,因爲序列化嘗試在連接關閉後枚舉查詢,所以失敗。

答案是在返回之前強制查詢枚舉。您可以通過將.ToList()添加到查詢的結尾(以其他方式)來完成此操作。

正如我所說,沒有看到任何代碼這是一個完整的猜測,但我在這些情況下有同樣的例外,所以這是值得檢查。