【问题标题】:IIS WebApi unable to open connection to Remote DatabaseIIS WebApi 无法打开与远程数据库的连接
【发布时间】:2018-04-15 03:57:51
【问题描述】:

我无法从我的 WebApi 进行任何数据库调用。我收到异常:“基础提供程序无法打开。”

我有一个 c# WebApi,它托管在 IIS v10.0.14393.0 下的 Windows Server 2016 上。然后我有一个在不同的 Windows Server 2016 上运行的 SQL Server 2016 数据库。每当我尝试进行要连接到数据库的 api 调用时,我都会遇到异常。当我在本地 IIS 上托管 WebApi 时,我没有收到任何错误。

问题:为什么远程Api连接不上远程Sql Server?

我已经做了一些配置:

  • Sql Server:已选中允许远程连接
  • Sql Server:Sql Server 和 Sql Server 浏览器服务正在运行
  • Sql Server:防火墙有一个入站规则,协议类型:TCP,本地端口:1433,范围远程 IP 地址:[WebApi 服务器地址]
  • WebApi Server:WebApiApplicationPool 和 DefaultAppPool 在标准 ApplicationPoolIdentity 下运行

其他信息:

  • 两台机器都可以相互ping通。
  • 我的连接字符串使用数据库帐户进行授权。

内部异常

System.Data.SqlClient.SqlException (0x80131904): 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) ---> System.ComponentModel.Win32Exception (0x80004005): The network path was not found
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.EntityClient.EntityConnection.Open()

【问题讨论】:

  • 您的网络服务器不可能拥有超过 1 个 IP?观察防火墙失败,看看是什么击中它。还要检查 SQL 是否正在侦听端口 1433,因为这已经有一段时间没有默认了
  • ipconfig 表示网络服务器只有 1 个 IP 地址。 Sql 正在侦听 IP2 和 IPAll 的端口 1433。我在防火墙的日志中找不到任何“奇怪”的东西。
  • 您是否看到尝试的连接?
  • 我正在查看 Microsoft -> Windows -> 高级安全 Windows 防火墙 -> 事件查看器中的防火墙,当我拨打电话时没有新事件。
  • 很可能是 DNS 的问题。

标签: c# sql-server iis asp.net-web-api


【解决方案1】:

您遇到的错误是一个专门的连接问题。您必须在 SQL Server 上检查您是否启用了 TCP/IP 协议,并且您用于连接的 IP 也已启用。这是尝试连接到 SQL Server 时的典型问题,因为在 SQL Express 上默认情况下禁用此功能。

您可以在这里查看如何操作:https://www.habaneroconsulting.com/stories/insights/2015/tcpip-is-disabled-by-default-in-microsoft-sql-server-2014

在这里:https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-a-server-to-listen-on-a-specific-tcp-port

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 2013-08-10
    • 2015-05-09
    • 2012-06-17
    • 2019-10-16
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多