You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Web API调用存储过程完成注册后,Postman响应中customer_id与temp_token返回Null问题排查

排查.NET Web API注册接口返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:12:37