2016-10-05 62 views
2

我們一直試圖在TransactionScope內使用SqlConnection。當我們創建了這個網站,並嘗試這個數據庫調用,我們遇到了一個錯誤:在TransactionScope中打開SqlConnection錯誤

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

所涉及的錯誤就行了cnn.Open()發生。

using (var scope = new TransactionScope()) 
using (var cnn = new SqlConnection(connectionString)) 
{ 
    cnn.Open(); 
    int result = cnn.QuerySingle<int>("SELECT 1"); 
    Console.WriteLine(result); 
} 

我們創建了一個控制檯應用程序來弄清楚什麼是錯的,發現從「假」到「真」改變我們的連接字符串關鍵字「池」允許這在控制檯應用程序運行,併成功返回我們結果。

我們對我們的網站連接字符串進行了相同的更改,與之前返回的錯誤相同。

是否有任何原因,此代碼不起作用?

+0

首先,爲什麼彙集了嗎?其次,這聽起來像池會導致相同的物理連接重複用於多個邏輯連接。這是非確定性的,可以在任何時候中斷。發佈更完整的代碼。可能有多個查詢或多個Open。 – usr

+0

Azure Portal向我們提供的連接字符串中沒有合併池。我們嘗試開啓此功能,並在本地機器上運行,但未部署到我們的網絡應用程序中。當有一個或多個查詢或連接時,它沒有任何區別,它在第一次打開時失敗 – Cassius40k

回答

0

我是在假設web.config是合法的,因爲通過Kudu服務查看文件顯示了我期望的連接字符串,但顯然這不是Azure中的情況。

我發現Azure發佈配置文件重寫了我們的web.config連接字符串,此重寫仍包含「Pooling = false」。

現在刪除它可以讓我們的代碼按預期運行。

This blog post詳細解釋:

"When this code runs on a developer’s local machine, the value returned will be the one from the web.config file. However when this code runs in Windows Azure Web Sites, the value returned will instead be overridden with the value entered in the portal"