.NET Maui安卓应用连接SQL Server 2005预登录握手出错求助
解决.NET Maui安卓端连接SQL Server的预登录握手错误
问题概述
Windows环境下运行.NET Maui项目可正常连接SQL Server,但同WiFi网络的安卓设备执行await connection.OpenAsync();时触发错误:
已成功与服务器建立连接,但预登录握手期间发生错误。(provider: TCP Provider, error: 35 - 捕获到内部异常)
已确认:
- 安卓、Windows端均可Ping通SQL Server服务器
- 连接字符串已配置
Encrypt=False;TrustServerCertificate=True;
核心相关代码:
// 连接字符串配置 sqlServerConnection1 = "Server=172.30.20.4;Database=HK_UDSdb;User Id=sa;Password=strongpassword;Encrypt=False;TrustServerCertificate=True;"; // 连接执行逻辑 using (var connection = _databaseHelper.SQLConnection()) { await connection.OpenAsync(); // 安卓端此处触发报错 // ... 查询逻辑 }
排查与解决方案
1. 检查SQL Server TCP/IP端口配置
- 打开SQL Server配置管理器,进入SQL Server网络配置 -> MSSQLSERVER的协议,确认TCP/IP已启用
- 双击TCP/IP,切换到IP地址标签页:
- 确保
IPAll下的TCP端口设置为1433(或你自定义的端口) - 检查服务器所在网段的IP地址(如172.30.20.x),对应条目需启用,且TCP端口与
IPAll一致
- 确保
- 修改后重启SQL Server服务生效
2. 连接字符串显式指定端口
安卓网络栈可能对默认端口解析存在异常,在Server字段后追加端口号:
sqlServerConnection1 = "Server=172.30.20.4,1433;Database=HK_UDSdb;User Id=sa;Password=strongpassword;Encrypt=False;TrustServerCertificate=True;";
3. 确认安卓网络权限
检查Platforms/Android/AndroidManifest.xml,确保已添加必要权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Android 10及以上设备可额外添加ACCESS_WIFI_STATE权限。
4. 调整SQL Server身份验证与账户权限
- 确认SQL Server已启用混合模式身份验证(Windows+SQL Server身份验证)
- 检查
sa账户状态:在SQL Server的登录名中,确保sa已启用,且状态为「允许连接到数据库引擎」 - 授予
sa对目标数据库(HK_UDSdb、HK_UDSorderdb)的权限,如db_datareader、db_datawriter
5. 适配SQL Server TLS版本
安卓设备的TLS支持版本可能与Windows不同,若SQL Server强制使用高版本TLS(如TLS 1.3),会导致握手失败:
- 登录SQL Server所在服务器,打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols - 若安卓设备系统版本较旧,尝试启用TLS 1.0/TLS 1.1;或升级安卓设备系统以支持更高版本TLS
- 修改后重启服务器生效
6. 替换为Microsoft.Data.SqlClient(备选)
Maui推荐使用Microsoft.Data.SqlClient替代旧版System.Data.SqlClient:
- 移除旧SQL Client引用,安装NuGet包
Microsoft.Data.SqlClient - 修改代码中的连接对象引用,确保使用
Microsoft.Data.SqlClient.SqlConnection
验证步骤
- 若修改了服务器配置,重启SQL Server服务
- 清理Maui安卓构建缓存,重新部署到设备
- 执行连接测试,确认
await connection.OpenAsync();是否成功
内容的提问来源于stack exchange,提问作者Raffy
相关产品推荐
相关产品推荐

