2013-03-25 153 views
26

我做的一個示例代碼和我得到了一個非常奇怪的行爲stucked,我想用我不使用此連接字符串IIS/SQL服務器連接錯誤

"Data Source=" + ServerName + "." + DomainName + ";Initial Catalog="+DBName+";Integrated Security = false;Persist Security Info=false;User ID=sa;Password=" & Mypassword & ";Connection Timeout=90" 

顯然連接到SQL Server Windows集成身份驗證或(SSPI),當我使用這個Web應用程序上我得到這個錯誤:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

只是要注意我創建了一個使用相同的連接字符串,並從計算機到哪裏運行的.NET應用程序IIS駐留並且工作正常。

下面是我做的步驟:

  1. 我檢查了SQL客戶端配置我打開了它,並同時啓用了TCP協議和命名管道。

  2. 我在IIS上進行了模擬,並使用了Windows身份驗證,並確保IIS使用與我的憑據相同的憑據。

  3. 我使用Wireshark來查看wut是兩個連接之間的差異,我無法理解輸出,但它似乎從IIS始終嘗試使用Windows身份驗證,雖然我已明確地使字符串不使用Windows身份驗證基本上發生的情況是,在應用程序「not_defined_in_RFC4178 @ please_ignore」中似乎相同的連接開始時的一些協商,然後IIS始終向NTLMSSP發出通知,指出我的用戶無權訪問數據庫除了通過用戶名和密碼外,所以協商失敗與IIS通常從應用程序成功。

我的問題是,請問有什麼可以解決這個問題,我有種假設有一些配置,必須經歷從IIS任何SQL客戶端使用Windows身份驗證,但我不知道在哪裏或如何禁用它

我注意到我沒有爲SQL Server連接字符串使用web.config配置,並且這個問題發生在IIS7中。

+2

如何是服務器名稱,域名,數據庫名設置的值是多少?他們是否正確? – Netricity 2013-03-25 11:18:01

+0

是這樣的,它在其他常規應用程序中使用相同的確切值。這是第一件事經歷了我的想法 – 2013-03-25 11:24:27

+0

我非常確定這不是,但是您是否試圖從'='附近刪除空格,在集成安全性= false – LukeP 2013-03-25 11:46:41

回答

2

檢查ServerName,DomainName,DBName的值& MyPassword。 他們是否正確? 他們如何填充?

+0

他們是正確的我檢查了他們 – 2013-03-25 11:25:36

6

這裏是第一件事情我會檢查:

  1. 驗證應用程序池用戶有權既然你說,它的工作原理,當你登錄到本機訪問網絡資源

    • ,嘗試將應用程序池用戶更改爲登錄到計算機的用戶。
  2. 檢查您的web.config中是否啓用了模擬。如果這樣做,請確保用戶可以訪問網絡資源。

  3. 嘗試更改連接字符串以使用IP地址(作爲測試)。如果解決了這個問題,也許這是某種DNS問題。

    • 請務必包括,1433在IP地址
    • Network Library=DBMSSOCN的連接字符串的結尾。 (更多信息請參閱本article上ConnectionStrings.com。)
+0

我如何檢查1和2? 對於3,在我的情況下,使用IP地址仍然會引發相同的錯誤,但添加1433端口會將錯誤更改爲「TCP提供程序,錯誤:0-由於目標計算機主動拒絕而無法建立連接」儘管這是SQL Server使用的正確的tcp端口號。 – 2013-05-25 13:59:37

+0

更新:*我* WebService和WinForms應用程序獲得「積極拒絕它」錯誤0如果我添加「,1433」。我上面說過端口是正確的,因爲用「netstat -ano | findstr 1433」檢查目標機器會顯示sqlservr.exe的pid。至於#2,我使用了IIS身份驗證功能,並將「ASP.NET模擬」顯示爲禁用。 – 2013-05-25 14:17:42

+3

嘗試SQL服務器計算機上的相同連接字符串。還要確保防火牆允許1433入站SQL服務器計算機上。 – 2013-05-26 12:18:13

4

如果您鍵入如上確切的連接字符串,請改變&在連接字符串周圍密碼+

上面寫的連接字符串是無效的字符串,因爲在所有的字符串可以串聯使用+在C#中不使用&我所知另一個字符串。

+0

+1:good抓住。這可能只是一個剪貼錯誤的錯字。 – RBarryYoung 2013-05-29 14:12:37

+0

這是一個值得關注的問題,但並不影響核心問題:完整的連接字符串在Web應用程序/ Web服務和.NET(表單)應用程序中都是相同的,前者會爲其提出錯誤,後者將工作得很好。 – 2013-05-29 15:10:25

+0

對於任何給這個「答案」+1的人:你真的相信這樣的錯字會產生「在建立到SQL Server的連接時發生的網絡相關或實例特定的錯誤。服務器未找到或無法訪問。 [(]提供程序:命名管道提供程序,錯誤:40 - 無法打開連接到SQL Server)「,而不是語法錯誤?!? – 2013-05-31 12:14:38

3

除了別人指出的之外,我唯一一次回憶「命名管道」參考的錯誤消息是基於如何設置SQL-Server。

爲了確認,我進入了我的SQL Server配置管理器版本。然後,查看 「SQL Native Client 11.0配置」(以防萬一,32位和64位)並打開以顯示「客戶端協議」。其中顯示共享內存,TCP/IP和命名管道的選項。確保您的「命名管道」協議已啓用。

+0

在我的情況下,它已啓用。也許你錯過了「.Net *應用程序*,它使用來自IIS所在計算機的相同連接字符串[...]正常工作。」部分? – 2013-05-29 13:50:28

+1

臭名昭着的「命名管道」部分錯誤信息幾乎都是紅鯡魚。看到我上面的評論。 – RBarryYoung 2013-05-29 14:10:16

3

您提到SQL Server在另一臺機器上。您應該確保該機器上的SQL Server Browser服務正在運行。

您可以在Windows服務管理控制檯(以及其他位置)找到它。

此外,您必須確保防火牆中的UDP端口1434已打開。

+0

就我而言,它正在運行。也許你錯過了「.Net *應用程序*,它使用來自IIS所在計算機的相同連接字符串[...]正常工作。」部分? – 2013-05-29 13:51:09

+0

@ C.B。 - 我沒有看到任何說.NET應用程序和SQL在獨立機器上的東西。在應用程序和SQL位於同一臺計算機上的情況下,本地計算機應用程序可能會工作。但是,外部應用程序可能不會。 (請參閱我的有關打開防火牆的更新。) – 2013-05-29 14:12:10

+0

嗯,工作。NET應用程序與IIS在同一臺計算機上,並且IIS與SQL Server位於不同的計算機上......這是不是足夠的信息? – 2013-05-29 14:42:40

2

先做檢查:

確保您的SQL Server接受遠程連接

SQL Server實例 - > Properities- - >連接 - >允許遙遠而明亮的連接。

以下這個步驟在第二:

嘗試建立在VS與服務器管理器面板的連接:

1)打開服務器瀏覽器。

2)右鍵單擊「數據連接」,選擇「添加連接」

3)在隨後的對話框中,選擇您的數據源和數據庫,指定安全信息,並按下「測試連接」按鈕。

4)當連接成功後,按「OK」

5)突出顯示服務器資源管理器窗格中的數據庫,並期待在屬性面板。將顯示一個連接字符串的工作示例,您可以將其複製並粘貼到您的應用或配置文件中。

+0

1:允許遠程連接。 2:VS生成的連接字符串和我正在使用的連接字符串之間的唯一區別是額外的「Persist Security Info = True」。雖然沒有幫助,但我仍然得到「建立到SQL Server的連接時發生了與網絡相關或特定於實例的錯誤。服務器未找到或無法訪問。請確認實例名稱是否正確,並且SQL Server是配置爲允許遠程連接(提供程序:命名管道提供程序,錯誤:40 - 無法打開與SQL Server的連接)「。 – 2013-05-30 11:22:57

+0

@ C.B。 - 當你在Visual Studio中測試連接時,這個問題還不清楚 - 是否工作或者沒有? – mikey 2013-06-01 13:24:25

+0

@密鑰:它的工作,但我已經清楚,連接字符串本身是好的,因爲它在測試應用程序中工作。順便說一下,爲什麼不添加自己的答案,以便在一個地方提供所有有用的鏈接? ;-) – 2013-06-01 13:45:52

0

可能是SQL服務器沒有被客戶端系統

確認,因爲發生因SQL Server的網絡錯誤不可用,也可能是網絡故障某些錯誤

+0

嗯...沒有。也許你錯過了「.Net *應用程序*,它使用來自IIS所在計算機的相同連接字符串[...]正常工作。」部分? – 2013-05-31 12:12:01

2

讓我們檢查到的步驟解決這個錯誤。

1)SQL Server應該啓動並運行。 2)在SQL Server配置 3)防火牆 4打開端口在Windows)啓用TCP/IP啓用遠程連接 5)啓用SQL Server Browser服務 6)防火牆 創建sqlbrowser.exe的例外7)重新創建別名

Source here

希望它可以幫助