如何为Azure SQL存储过程创建API包装器?Azure服务选型咨询
解决方案说明
一、需用到的Azure服务类型
- Azure SQL数据库:你已在使用,用于运行目标存储过程
- API承载服务:核心可选两种类型:
- Azure Functions(无服务器):适配轻量、低流量的API场景
- Azure Web App:适合已有Web应用,希望整合API的场景
- 安全辅助(可选但推荐):Azure Managed Identity,替代硬编码的数据库连接字符串,提升安全性
二、最简省成本的实现方案
首选Azure Functions(无服务器消耗计划),核心原因是按执行次数计费,空闲时段无成本,完美匹配这类简单API的使用场景。具体步骤:
- 创建HTTP触发的Function,设置路由模板为
/{code},这样请求myappid.azurewebsites.net/XYZ时,XYZ会自动作为参数传入 - 用C#/.NET编写Function逻辑,调用存储过程并返回JSON结果:
using System.Data.SqlClient; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "{code}")] HttpRequest req, string code, ILogger log) { var connectionString = Environment.GetEnvironmentVariable("SqlConnectionString"); using var conn = new SqlConnection(connectionString); await conn.OpenAsync(); using var cmd = new SqlCommand("[dbo].[PGET_JSON]", conn); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@code", code); var jsonResult = await cmd.ExecuteScalarAsync() as string; return new ContentResult { Content = jsonResult, ContentType = "application/json", StatusCode = 200 }; } - 在Function的应用设置中配置数据库连接字符串(或使用Managed Identity,给Function赋予Azure SQL的访问权限,无需明文连接字符串)
- 发布Function到Azure,即可通过指定URL访问
该方案成本极低:无服务器消耗计划每月提供100万次免费执行额度,超出后每百万次仅需几美元,完全适配轻量使用需求。
三、是否应添加至已有Azure Web App?
分场景判断:
- 适合整合的情况:
- 已有Web App是ASP.NET Core技术栈,整合后代码风格统一,运维更便捷
- 已有Web App流量较低,添加该API不会显著增加资源消耗与成本
- 希望API与已有应用共享身份验证、日志等配置体系
- 适合单独部署的情况:
- 已有Web App是其他技术栈(如Node.js、Python),整合.NET代码会增加复杂度
- 已有Web App流量较高,单独部署Function可隔离负载,避免影响主应用
- 追求极致成本优化:单独使用Function的免费额度,无需占用Web App的资源配额
总结:如果已有Web App是.NET栈且流量低,整合进去没问题;否则单独部署Azure Functions更划算、更简单。
内容的提问来源于stack exchange,提问作者Vojtěch Dohnal
相关产品推荐
相关产品推荐

