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

时间:2016-09-23 13:47:32

标签: c# .net sql-server sqlconnection

SQLConnection使用随机命名管道(445)而不是tcp(1433)。 namedpipes端口被我们的防火墙阻止,但不是tcp。只有在尝试连接到我们的某个sql服务器时才会发生这种情况。大多数情况下,应用程序使用tcp但随机尝试使用namedpipes端口。我们的sql连接非常简单,我们也不会喜欢它。

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

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

更新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(); 
…

6 个答案:

答案 0 :(得分:3)

  

我们不想在连接字符串上硬编码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";

APPEND:

您可以在问题计算机上围绕此注册表设置“捕获”。

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的MSSQLServer \客户\ ConnectTo \

如果设置或未设置DSQUERY,我会特别注意。

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

  

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

     

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

如果这是问题......... 最终,任何其他程序都可以改变此值 。所以你没有完全控制权。同样,更好的解决方案是将网络库放在连接字符串中,因此“外部力量”无法在游戏中期改变游戏。我知道这个的原因是因为我在客户端站点被烧了......其他一些程序改变了DSQUERY值,并且使用我们的应用程序的1/3客户端机器进行了爬行。因此,我没有打击它,而是在我们的连接字符串中放入网络库以永久解决问题。

答案 1 :(得分:2)

您永远不会提及此连接是否来自最终用户PC,Web服务器,其他数据库服务器等。但是,是否使用命名管道或TCP作为主协议是创建连接的PC上的设置。这可以使用SQL Server Native Client Configuration进行配置,也可以在连接字符串中覆盖。

  

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

     
      
  1. 在SQL Server配置管理器中,展开“SQL Server Native Client配置”,右键单击“客户端协议”,然后单击“属性”。
  2.   
  3. 在“启用的协议”框中,单击“上移”或“下移”,以在尝试连接到SQL Server时更改尝试协议的顺序。 Enabled Protocols框中的顶级协议是默认协议。
  4.         

    配置客户端以使用TCP / IP

         
        
    1. 在SQL Server配置管理器中,展开“SQL Server Native Client配置”,右键单击“客户端协议”,然后单击“属性”。
    2.   
    3. 在“启用的协议”框中,单击向上和向下箭头以更改尝试连接到SQL Server时尝试协议的顺序。 Enabled Protocols框中的顶级协议是默认协议。
    4.   

请参阅Configure Client Protocols

答案 2 :(得分:1)

<块引用>

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

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

<块引用>

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

  • TCP
  • 命名管道

当客户端计算机尝试创建 TCP 时 连接到服务器并且连接尝试返回非零值 返回代码,客户端透明地尝试使用 列表中的下一个协议,即命名管道。在这种情况下, 客户端无法建立 TCP 连接;然而,客户成功 建立命名管道连接。

注意

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

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

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

答案 3 :(得分:0)

服务器端怎么样?

我将在服务器上的 SQL Server实例配置

中仔细检查
  • 在服务器上启用哪些协议,行为符合预期
  • 在显示意外行为的服务器上启用了哪些协议

我的猜测是&#39;打破&#39;服务器已启用命名管道,而其他服务器则不这样,当.NET客户端选择连接协议时,有时会做出错误的选择。

这是一个疯狂的猜测,因为我不知道.NET如何选择连接协议......

答案 4 :(得分:0)

我遇到了这个问题。我怀疑是AppLocker限制或在网络驱动器上运行该应用程序引起的。我在本地复制了该应用程序,并解决了该应用锁的限制,现在它似乎使用了正确的端口。

我没有收到任何错误,甚至用连接字符串强制设置参数都无法解决该问题。现在,它按预期使用端口1433。

答案 5 :(得分:-1)

出现这些错误的原因可能有多种。检查所有步骤。

<块引用>

1.检查您是否可以 ping SQL Server 框

确保您能够从客户端计算机 ping 安装 SQL Server 的物理服务器。如果没有,您可以尝试使用 IP 地址(对于默认实例)或命名实例的 IP 地址\实例名称连接到 SQL Server。

<块引用>

2.检查 SQL 服务是否正在运行

确保 SQL 服务正在运行 您可以使用 SC 命令或 SQL Server 配置管理器检查 SQL Server 服务。很多时候您可能会发现 SQL Server 实例没有运行。

<块引用>
  1. 检查 TCP/IP 和命名管道是否已启用

检查 TCP/IP 和命名管道协议和端口。打开 SQL Server 配置管理器并检查 SQL Server 网络配置协议。您应该启用命名管道和 TCP/IP 协议。

<块引用>

4.检查是否启用了允许此服务器的远程连接

检查是否启用了允许此服务器的远程连接。在 SSMS 中,右键单击实例名称并选择属性。转到“连接”选项卡并确保选中“允许远程连接到此服务器”。如果需要进行更改,则必须重新启动 SQL Server 实例才能应用更改。

<块引用>

5.检查防火墙没有阻止对 SQL Server 的访问

为 SQL Server 端口和 SQL Server Browser 服务配置 Windows 防火墙。转到控制面板并单击 Windows 防火墙。转到例外选项卡,如下所示。您可以阅读此提示配置 Windows 防火墙以与 SQL Server 配合使用以了解更多信息。