SQLConnection 使用随机命名管道而不是 tcp

seb*_*eau 5 .net c# sql-server sqlconnection

SQLConnection 使用随机命名管道(445) 而不是tcp(1433)。命名管道端口被我们的防火墙阻止,但 tcp 未被阻止。仅当尝试连接到我们的 SQL 服务器之一时才会发生这种情况。大多数时候应用程序使用 TCP,但随机尝试使用命名管道端口。我们的 sql 连接非常简单,我们没有做任何花哨的事情。

\n\n

我们不想在连接字符串上硬编码 TCP 端口。我们已经尝试过并且解决了问题。该问题仅在上周出现,并且我们尝试连接的 Web 应用程序已运行一段时间。

\n\n

为什么sql连接有时会尝试连接445而不是1433?这是 .net 最新更新引入的错误还是服务器可以指定要使用的下一个端口?

\n\n

更新 2016-09-23 11:00

\n\n

这是我们用于连接的代码示例

\n\n
string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True";\nusing (SqlConnection connection = new SqlConnection(connectionString))\n{\n    try {\n        connection.Open(); \n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

gra*_*der 5

我们不想在连接字符串上硬编码 TCP 端口。

您不必将 IP 地址/端口号放入连接字符串中。

但是,您可以在连接字符串中强制使用网络协议。

Network Library=DBMSSOCN;
Run Code Online (Sandbox Code Playgroud)

https://www.connectionstrings.com/define-sql-server-network-protocol/

但是,当我遇到导致性能下降的随机命名管道问题时,我会使连接字符串尽可能“具体”。这是...指定网络库、IP 地址和端口号。

顺便说一句,我真的非常希望您实际上没有在编译代码中编码连接字符串,并且下面不是您的实际代码。

string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True";
Run Code Online (Sandbox Code Playgroud)

附加:

您可以在有问题的机器上“钓鱼”这个注册表设置。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo\

我会具体查看 DSQUERY 是否设置。

https://support.microsoft.com/en-us/kb/328306

检查以下注册表子项中指定的协议: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo\DSQUERY 该值通常反映 CNU 中的设置,但有时并非如此。

如果值为 DBNETLIB,则使用 CNU 启用的协议列表中的协议之一。如果列出了特定协议,则使用该协议。

如果这是问题......最终,任何其他程序都可以更改此值。所以你没有完全的控制权。同样,更好的解决方案是将网络库放在连接字符串中,这样“外部力量”就无法在游戏中期改变你的游戏。
我知道这一点的原因是因为我在客户端站点被烧毁了......其他一些程序更改了大约 1/3 客户端计算机(也正在使用我们的应用程序)的 DSQUERY 值,并且我们的应用程序性能下降了爬行。又或者,其他一些公司......做了一些事情让我们的应用程序性能变得很糟糕。因此,我没有与之对抗,而是将网络库放入连接字符串中以永久解决该问题。