开发者社区 > 云原生 > Serverless > 正文

函数计算无法访问自建数据库

已解决

问题描述

函数计算无法访问自建数据库,函数运行环境为.NET Core 3.1 

            using (var conn = new SqlConnection(connStr))

            {

                conn.Open();

                ...

            }

数据库连接串为 Data Source=ip,端口;Initial Catalog=数据库名;User ID=账号;Password=密码

报错信息:

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=41; handshake=231; [Login] initialization=2; authentication=9; [Post-Login] complete=14179; 

---> System.ComponentModel.Win32Exception (258): Unknown error 258    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken)    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.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)    at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)    at System.Data.SqlClient.SqlConnection.Open()     Error Number:-2,State:0,Class:11

期望结果

函数可以访问自建mssql数据库

已尝试的方法

在函数内可以调用http的接口说明函数是可以连到自建的服务器的,代码及数据库连接串正确

展开
收起
不是四四 2022-12-09 11:47:11 151 0
2 条回答
写回答
取消 提交回答
  • 采纳回答

    asp.net core 程序是跑在容器中的,容器镜像用的是 mcr.microsoft.com/dotnet/core/aspnet:3.0 运行容器内的 openssl 命令发现 openssl 的版本比较高 # docker exec -t $(docker ps --filter name=blog_api -q) openssl version OpenSSL 1.1.1b 26 Feb 2019 查看 openssl.cnf 配置文件 # docker exec -t $(docker ps --filter name=blog_api -q) cat /etc/ssl/openssl.cnf [system_default_sect] MinProtocol = TLSv1.1 CipherString = DEFAULT@SECLEVEL=2 发现允许的 ssl 最低版本是 TLSv1.2 ,而程序所使用的 SQL Server 数据库版本比较低不支持 TLSv1.2 ,修改为 TLSv1.0 后问题解决 修改方法:在 Dockerfile 中添加下面的指令 RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf

    2022-12-20 18:08:22
    赞同 展开评论 打赏
  • 阿里云Serverless产品专家,NUDT博士;开源项目Serverless Devs (CNCF Sandbox Project)发起人。畅销书《Serverless架构:从原理、设计到项目实战》《Serverless工程实践》《Serverless架构下的AI应用开发》作者。

    函数计算是可以访问数据库的,函数计算不会区分你是自建的还是用的云数据库,我本人自己尝试过自建和云数据库都是可以用的。目前我就是在本地物理机搭建的数据库,用frp做代理映射到工网,然后函数计算访问,无论是VPC内还是公网访问,也都是没问题的。所以上面的问题大概率还是代码和配置原因。

    初步来看是“Connection Timeout Expired. ”,一般情况下都要考虑:

    1. 函数计算和你的数据库网络是否是通的,如果你的数据库是建立在ecs等地方,而又通过了VPC等访问,你是否已经将函数放在了同一个VPC下;
    2. 部分数据库会增加白名单限制,看看是否需要解开白名单限制,让函数计算得以访问;
    3. 如果没有白名单,也通过工网,还可以排查一下端口是否通的;

    这个问题目前看确实是代码和配置因素。如果有问题也可以进一步联系我。

    2022-12-13 11:10:55
    赞同 展开评论 打赏

快速交付实现商业价值。

相关产品

  • 函数计算
  • 热门讨论

    热门文章

    相关电子书

    更多
    低代码开发师(初级)实战教程 立即下载
    冬季实战营第三期:MySQL数据库进阶实战 立即下载
    阿里巴巴DevOps 最佳实践手册 立即下载