.NET Core 3.1/5连接Snowflake超时但.NET Framework 4.7.2运行正常
问题描述
相同的Snowflake连接逻辑在.NET Framework 4.7.2环境下运行正常,但在.NET Core 3.1和.NET 5环境下无法连接,使用的Snowflake.Data版本为2.0.6。
代码示例
using (IDbConnection conn = new SnowflakeDbConnection()) { conn.ConnectionString = "scheme=https;ACCOUNT=Test;HOST=Test.us-east-1.snowflakecomputing.com;port=443; ROLE=PSR_USER_POC_ROLE;WAREHOUSE=DEMO_WH; USER=PSR_USER; PASSWORD=PSR_USER;DB=UTIL_DB;SCHEMA=PSR_USER_POC"; conn.Open(); conn.Close(); }
错误日志
Snowflake.Data.Client.SnowflakeDbException: 'Snowflake Internal Error: Unable to connect. One or more errors occurred. (Request reach its timeout.)' SnowflakeDbException: Request reach its timeout. AggregateException: One or more errors occurred. (Request reach its timeout.)
可参考对应包的README.md文件中的示例开启日志用于问题排查。
解决方案
- 修正连接字符串参数
- 移除参数前后多余空格:当前连接字符串中
ROLE、USER等参数前带有空格,.NET Core下的参数解析逻辑对空格敏感度高于.NET Framework,会导致参数识别异常,需删除所有参数前后的空格 - 简化账户配置:同时填写ACCOUNT和HOST参数存在冗余,可直接将ACCOUNT参数改为
Test.us-east-1,删除HOST参数即可,避免解析冲突
- 移除参数前后多余空格:当前连接字符串中
- 显式指定TLS版本:Snowflake要求请求使用TLS 1.2及以上版本,.NET Core的默认TLS策略和.NET Framework存在差异,在打开连接前添加以下代码:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; - 延长超时时间+开启会话保活:在连接字符串中添加两个参数
CONNECTION_TIMEOUT=120;CLIENT_SESSION_KEEP_ALIVE=true;,避免首次握手时超时 - 禁用不必要的代理检测:.NET Core默认会启用系统代理检测,无代理环境下该逻辑会拖慢请求甚至触发超时,在程序初始化阶段添加以下代码:
System.Net.WebRequest.DefaultWebProxy = null; AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false); - 升级依赖包版本:Snowflake.Data 2.0.6是较早的版本,存在多个已知的.NET Core适配bug,升级到最新稳定版可直接解决大部分跨版本兼容问题
内容的提问来源于stack exchange,提问作者user3239484
相关产品推荐
相关产品推荐

