Azure定时触发函数部署后MySQL连接失败(本地正常)
解决Azure定时函数连接Azure MySQL的Socket权限错误问题
1. 修正连接字符串配置与格式
- 禁止硬编码敏感信息:Azure函数需通过应用配置存储连接字符串,避免直接写在代码里。在Azure门户的函数应用→配置→应用程序设置中添加连接字符串(名称示例:
BoppWhDbConnection),使用Azure MySQL标准格式:
必须添加Server=<server_name>.mysql.database.azure.com;Database=boppwh;Uid=<username>;Pwd=<password>;SslMode=Required;SslMode=Required,Azure MySQL强制要求SSL连接,缺失此参数会直接导致连接失败。 - 代码中读取配置:修改代码通过依赖注入获取配置,替换硬编码逻辑:
用using System; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; using MySql.Data.MySqlClient; using Microsoft.Extensions.Configuration; namespace Ash.Function { public class AshDaily { private readonly ILogger _logger; private readonly string _connectionString; public AshDaily(ILoggerFactory loggerFactory, IConfiguration configuration) { _logger = loggerFactory.CreateLogger<AshDaily>(); _connectionString = configuration.GetConnectionString("BoppWhDbConnection"); } [Function("AshDaily")] public void Run([TimerTrigger("*/30 * * * * *")] TimerInfo myTimer) { using (var bp1db = new MySqlConnection(_connectionString)) { bp1db.Open(); string query1 = "SELECT COUNT(cellid) AS free1 FROM cells WHERE Status = 0"; using (MySqlCommand cmd1 = new(query1, bp1db)) using (MySqlDataReader reader1 = cmd1.ExecuteReader()) { string freecell = String.Empty; while (reader1.Read()) { freecell = reader1.GetString("free1"); } _logger.LogInformation("空闲单元格数量: {FreeCell}", freecell); } } } } }using语句自动释放连接、命令和读取器,避免资源泄漏;通过IConfiguration读取配置,符合Azure函数最佳实践。
2. 检查Azure MySQL防火墙规则
- 登录Azure门户,进入你的MySQL服务器→防火墙和虚拟网络,确保允许Azure服务和资源访问此服务器开关处于开启状态。
- 若函数应用部署在虚拟网络内,需添加对应VNet规则,允许虚拟网络流量访问MySQL服务器。
3. 验证函数应用的网络出站权限
- 若函数应用启用了专用端点或网络限制,需确认出站规则允许访问MySQL服务器的3306端口(Azure MySQL默认端口)。
- 检查函数应用的网络配置→出站流量,确保未阻止到
<server_name>.mysql.database.azure.com:3306的连接。
4. 调整连接实例使用方式
- 不要将
MySqlConnection作为类的只读字段复用,连接池会自动管理连接资源,每次请求创建新连接并通过using释放是更安全的做法,复用实例可能导致连接状态异常。
内容的提问来源于stack exchange,提问作者lavava92
相关产品推荐
相关产品推荐

