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

本文关键字:tcp 管道 随机 SQLConnection | 更新日期: 2023-09-27 18:08:25

SQLConnection使用随机命名的管道(445)而不是tcp(1433)。namedpipes端口被我们的防火墙阻塞了,而tcp没有。这只发生在试图连接到我们的sql服务器之一时。大多数情况下,应用程序使用tcp,但随机尝试使用namedpipes端口。我们的sql连接非常简单,我们没有做什么花哨的事情。

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

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

UPDATE 2016-09-23 11:00

下面是我们用来连接 的代码示例
string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    try {
        connection.Open(); 
…

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

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

你不必把IP地址/端口号#放在你的连接字符串中。

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

Network Library=DBMSSOCN;
https://www.connectionstrings.com/define-sql-server-network-protocol/

但是,当我遇到随机命名管道问题时,会减慢性能,我会使连接字符串尽可能"特定"。这是……指定网络库、IP地址和端口号

顺便说一下,我真的真的希望你不是在编译代码中编码你的连接字符串,下面不是你的实际代码。

string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True";

附加:

您可以在问题机器上绕过这个注册表设置。

微软HKEY_LOCAL_MACHINE ' SOFTWARE ' ' 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值,我们的应用程序性能下降了。又名,其他公司....做了一些使我们的应用程序性能糟糕的事情。因此,我没有与之抗争,而是将网络库放入我们的连接字符串中,以永久解决这个问题。

你从来没有提到如果这个连接是由终端用户pc, web服务器,其他数据库服务器等。然而,是否使用命名管道或TCP作为主要协议是PC上创建连接的设置。这可以使用SQL Server Native Client Configuration配置,也可以在连接字符串中覆盖。

更改客户端计算机的默认协议或协议顺序

  1. 在SQL Server配置管理器中,展开SQL Server本地客户端配置,右键单击客户端协议,然后单击属性。
  2. 在"启用的协议"框中,单击"向上移动"或"向下移动",以更改尝试连接到SQL Server时尝试协议的顺序。"已启用协议"框中的顶部协议为默认协议。

配置客户端使用TCP/IP

  1. 在SQL Server配置管理器中,展开SQL Server本地客户端配置,右键单击客户端协议,然后单击属性。
  2. 在"启用协议"框中,单击向上和向下箭头以更改尝试连接到SQL Server时尝试协议的顺序。"已启用协议"框中的顶部协议为默认协议。

参见配置客户端协议

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

决定协议顺序的是客户端而不是服务器。大多数客户端驱动程序将首先使用TCP/IP,然后在TCP连接失败时返回到命名管道。下面是适用于SqlClient的相关文档摘录:

例如,如果客户端计算机同时具有TCP和命名管道可用,顺序为:

  • TCP
  • 命名管道

当客户端计算机试图建立TCP时连接到服务器,连接尝试返回非零返回代码,客户端透明地使用列表中的下一个协议是Named Pipes。在这个场景中,客户端无法建立TCP连接;然而,客户端成功了创建一个Named Pipes连接。

注意

The client does not receive an error that indicates the first protocol failed.

如果客户端应用程序使用第二个协议,它也返回一个错误,一个错误返回给客户端。

因此,为了更直接地回答您的问题,尝试命名管道只是因为初始TCP连接失败。客户端错误消息表明命名管道连接失败,但这只是初始TCP连接失败的副作用。根据您的症状,根本原因是间歇性数据库或网络连接问题,与使用命名管道完全无关。

服务器端呢?

我会在服务器上的SQL Server实例配置中仔细检查:

  • 哪些协议在服务器上被启用
  • 显示意外行为的服务器上启用了哪些协议

我的猜测是"坏"的服务器已经启用了命名管道,而其他服务器没有,所以当。net客户端选择连接协议时,有时会做出错误的选择。

这是一个大胆的猜测,因为我不知道。net是如何选择连接协议的…

我有这个问题。我怀疑这是AppLocker限制或运行应用程序的网络驱动器导致的。我在本地复制了应用程序并解决了applocker限制,现在它似乎使用了正确的端口。

我没有收到任何错误,甚至使用连接字符串强制参数也无法修复它。现在它按预期使用端口1433。