Win11下ASP.NET Web API出现参数化查询参数未传递错误
问题描述
- 运行环境:基于.NET 6.0开发的ASP.NET Web API,Windows 10本地运行正常,部署到Windows 11后报错
- 错误信息:
System.Data.SqlClient.SqlException (0x80131904),提示参数化查询期望参数@UserName但未提供 - 测试工具:Postman
- 已尝试的解决方法:
- 将
[FromBody]改为[FromForm]后出现415 Unsupported Media Type错误 - 设置请求
Content-Type为application/json,问题未解决
- 将
相关代码:
[HttpPost] public IActionResult post([FromBody] User user) { string query = "INSERT INTO User_Table (ut_User, ut_UserCode, ut_Branch) VALUES (@UserName, @UserCode, @Branch)"; string query2 = "SELECT * FROM User_Table WHERE @UserName = ut_User"; string sqlDataSource = _configuration.GetConnectionString("IMSConnStr"); using (SqlConnection mycon = new SqlConnection(sqlDataSource)) { mycon.Open(); using (SqlCommand cmd = new SqlCommand(query2, mycon)) { cmd.Parameters.AddWithValue("@UserName", user.UserName); SqlDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) return Ok(200); } } using (SqlConnection mycon = new SqlConnection(sqlDataSource)) { mycon.Open(); using (SqlCommand cmd = new SqlCommand(query, mycon)) { cmd.Parameters.AddWithValue("@UserName", user.UserName); cmd.Parameters.AddWithValue("@UserCode", user.UserCode); cmd.Parameters.AddWithValue("@Branch", user.Branch); cmd.ExecuteNonQuery(); } mycon.Close(); } return Ok(200); }
排查与解决思路
核心问题定位
报错本质是user.UserName为null或未被正确绑定,Windows 11上的异常并非系统兼容性问题,而是请求参数绑定或运行环境配置的问题。分步解决
- 验证请求体格式
确保Postman请求体为raw JSON格式,且结构与User类属性完全匹配,示例:
{ "userName": "testUser", "userCode": "001", "branch": "Beijing" }
注意属性名大小写(.NET默认大小写不敏感,但严格匹配可避免绑定异常)。
- 检查
User类定义
确保类属性为公共可访问且包含setter,示例:
public class User { public string UserName { get; set; } public string UserCode { get; set; } public string Branch { get; set; } }
私有属性或无setter会导致JSON无法绑定到对象。
- 启用绑定日志排查
在Program.cs添加日志配置,查看绑定失败的具体原因:
builder.Logging.AddConsole(); builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
运行后查看控制台日志,会显示参数绑定的详细错误信息。
- 替换
AddWithValue为强类型参数AddWithValue可能因类型推断问题导致参数未正确传递,改用强类型添加参数,同时处理null情况:
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = user.UserName ?? string.Empty;
- 检查Windows 11上的.NET运行时
确认Windows 11已安装与开发环境版本一致的ASP.NET Core 6.0运行时,运行时缺失会导致JSON解析组件异常。
- 代码优化建议
合并数据库连接操作,避免重复开闭连接,同时返回更明确的响应状态码:
[HttpPost] public IActionResult post([FromBody] User user) { if (user == null || string.IsNullOrEmpty(user.UserName)) { return BadRequest("用户信息不完整"); } string query = "INSERT INTO User_Table (ut_User, ut_UserCode, ut_Branch) VALUES (@UserName, @UserCode, @Branch)"; string query2 = "SELECT * FROM User_Table WHERE ut_User = @UserName"; string sqlDataSource = _configuration.GetConnectionString("IMSConnStr"); using (SqlConnection mycon = new SqlConnection(sqlDataSource)) { mycon.Open(); // 检查用户是否存在 using (SqlCommand cmd = new SqlCommand(query2, mycon)) { cmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = user.UserName; using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { return Conflict("用户已存在"); } } } // 插入新用户 using (SqlCommand cmd = new SqlCommand(query, mycon)) { cmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = user.UserName; cmd.Parameters.Add("@UserCode", SqlDbType.NVarChar).Value = user.UserCode; cmd.Parameters.Add("@Branch", SqlDbType.NVarChar).Value = user.Branch; cmd.ExecuteNonQuery(); } } return CreatedAtAction(nameof(post), new { userName = user.UserName }, user); }
内容的提问来源于stack exchange,提问作者DarthNinja45
相关产品推荐
相关产品推荐

