.NET Web API调用存储过程完成注册后,Postman响应中customer_id与temp_token返回Null问题排查
customer_id和temp_token为Null的问题 你遇到的情况很典型:数据库数据插入成功,但响应里的customer_id和temp_token始终返回Null。核心问题出在Controller层未正确使用Service返回的带值模型,再加上Service层的一个小逻辑错误,下面一步步拆解:
1. Controller层:错误复用了原请求对象构建响应
看你的Controller代码:
sso_service.Register(value); if (value is null) throw new Exception("Failed to register."); // ... JObject _jo = new JObject { { value }, { "Response:", Constant.RESP_SUCCESSFUL} }; return Request.CreateResponse(HttpStatusCode.OK, _jo);
这里的问题是:你调用Register方法后,没有接收它返回的SSO_Model对象。Register方法已经生成了包含customer_id和temp_token的新模型,但你依然用用户请求的原始对象value(这两个字段本来就是Null)来构建响应,自然返回Null。
修正方案
接收Service返回的模型,补充原请求的其他字段后再构建响应:
// 接收Service返回的带值模型 SSO_Model resultModel = sso_service.Register(value); if (resultModel is null) throw new Exception("Failed to register."); // 从原请求对象补充其他字段 resultModel.full_name = value.full_name; resultModel.phone_number = value.phone_number; resultModel.gender = value.gender; resultModel.id_number = value.id_number; resultModel.dob = value.dob; resultModel.nationality = value.nationality; resultModel.email = value.email; resultModel.secure_word = value.secure_word; resultModel.provider_id = value.provider_id; // 构建正确的响应对象 JObject _jo = new JObject { { "Customer_id", resultModel.customer_id }, { "full_name", resultModel.full_name }, { "phone_number", resultModel.phone_number }, { "gender", resultModel.gender }, { "id_number", resultModel.id_number }, { "dob", resultModel.dob }, { "nationality", resultModel.nationality }, { "user_id", value.email }, { "secure_word", resultModel.secure_word }, { "provider_id", resultModel.provider_id }, { "email", resultModel.email }, { "temp_token", resultModel.temp_token }, { "Response", Constant.RESP_SUCCESSFUL} }; return Request.CreateResponse(HttpStatusCode.OK, _jo);
2. Service层:错误尝试获取不存在的@temp_token输出参数
看你的Service代码:
_return = new SSO_Model() { customer_id = Convert.ToString(_xxx["@customer_id"].Value), temp_token = Convert.ToString(_xxx["@temp_token"].Value) };
你的存储过程里@temp_token是输入参数,不是输出参数。temp_token是你在Service里自己生成的加密字符串,已经传入存储过程,完全不需要从数据库获取这个值,直接用本地变量即可。
修正方案
直接使用本地生成的temp_token赋值:
_return = new SSO_Model() { customer_id = Convert.ToString(_xxx["@customer_id"].Value), temp_token = temp_token // 用之前生成的变量,无需从数据库取 };
3. 额外验证:存储过程的输出参数逻辑
你的存储过程里@customer_id是输出参数,逻辑没问题,但要确保db.ExecNonQueryWithOutput方法正确读取了这个输出参数的值。不过既然数据库插入成功,说明这个方法是正常工作的,只要前面两点修正,customer_id就能正确返回。
最终效果
完成上述修改后,Postman的响应里customer_id会从存储过程的输出参数获取,temp_token会用你生成的加密值,其他字段保持用户请求的内容,就能得到符合预期的响应了。
内容的提问来源于stack exchange,提问作者Taqiuddin Shokordey

