ASP.NET Core最小Web API如何读取请求体JSON传SQL Server存储过程
ASP.NET Core 最小Web API 实现方案
核心逻辑是跳过框架默认的强类型模型绑定流程,直接读取请求体原始流拿到完整JSON字符串,再通过ADO.NET作为参数传入SQL Server存储过程,全程不需要额外定义请求DTO类,是最简实现路径。
具体实现步骤
- 前置依赖确认
不需要引入第三方序列化、ORM相关包,仅需确保项目引用了Microsoft.Data.SqlClient用于SQL Server连接,.NET 6+版本的最小API项目默认已包含基础请求处理能力。 - 接口核心代码
直接在Program.cs中编写接口映射逻辑,不需要额外分层:
var builder = WebApplication.CreateBuilder(args); // 从配置文件读取数据库连接字符串,避免硬编码 var dbConnStr = builder.Configuration.GetConnectionString("SqlServerConnection"); // 可选:如果要传输超过30MB的大JSON,配置Kestrel请求体大小上限 builder.WebHost.ConfigureKestrel(opt => { opt.Limits.MaxRequestBodySize = 100 * 1024 * 1024; // 示例设置为100MB,按需调整 }); var app = builder.Build(); // 映射POST接口 app.MapPost("/api/save-json-data", async (HttpRequest request) => { // 重置请求体流位置,避免框架前置处理导致流读取为空 request.EnableBuffering(); request.Body.Position = 0; // 直接读取请求体原始JSON字符串,不做反序列化转换 string rawJsonContent = await new StreamReader(request.Body).ReadToEndAsync(); // ADO.NET调用存储过程 using var conn = new SqlConnection(dbConnStr); using var cmd = new SqlCommand("你的存储过程名", conn) { CommandType = System.Data.CommandType.StoredProcedure }; // 传入JSON字符串参数,对应存储过程参数建议定义为NVARCHAR(MAX)避免截断 cmd.Parameters.AddWithValue("@RawJson", rawJsonContent); await conn.OpenAsync(); // 执行存储过程,根据实际返回需求选择ExecuteScalarAsync/ExecuteReaderAsync var execResult = await cmd.ExecuteNonQueryAsync(); return Results.Ok(new { IsSuccess = true, RowsAffected = execResult }); }) .DisableAntiforgery(); // 非表单场景关闭防伪令牌校验,避免不必要的拦截 app.Run();
关键注意事项
- 存储过程接收JSON的参数务必设置为
NVARCHAR(MAX)类型,不要用定长NVARCHAR,否则长JSON会被截断。 - 不要给接口参数加
[FromBody]特性绑定自定义类,否则框架会自动执行JSON反序列化,既拿不到原始字符串,也会增加额外性能损耗。 - 调用接口时确保请求头
Content-Type设置为application/json,不要用表单格式提交。 - 如果需要做权限、异常处理,直接在MapPost后加对应中间件/过滤器即可,不影响核心逻辑。
内容的提问来源于stack exchange,提问作者W. Nema
相关产品推荐
相关产品推荐

