MVC应用Home控制器向Webhook控制器传值为null问题咨询
问题根因
你遇到的null问题本质是存储方案和Webhook的请求场景不匹配:
- Session、TempData、普通Cookie都是和用户浏览器会话绑定的存储方案:Session依赖请求Cookie中携带的SessionId做身份匹配,TempData底层默认也是基于Session实现,你在Home控制器写入数据时,仅对当前访问Home页面的用户浏览器会话生效。
- Webhook是第三方服务端发起的独立HTTP请求,根本不会携带普通用户浏览器的Cookie标识,所以Webhook控制器读取Session/TempData时,会识别为全新会话,自然返回null。
可行实现方案
你需要存储的用户名、密码属于敏感数据,推荐以下两种适配Webhook场景的实现方式:
1. 加密持久化存储+关联标识回调
操作逻辑如下:
- Home控制器拿到QueryString的用户名、密码后,先做对称加密,生成唯一的关联ID(比如GUID)
- 将加密后的账号密码和关联ID绑定,存储到数据库或者分布式缓存(比如Redis)中,同时设置合理的过期时间
- 给第三方服务配置Webhook回调地址时,把关联ID作为Query参数拼接,示例:
https://你的服务域名/Webhook/Callback?bindId=生成的GUID - Webhook控制器收到请求后,从QueryString拿到
bindId,去缓存/数据库查询对应的加密账号密码,解密后即可用于后续数据库操作,使用后可按需删除对应存储的数据避免泄露。
写入参考代码:
// 生成唯一关联ID var bindId = Guid.NewGuid().ToString("N"); // 加密用户名密码,Encrypt方法为你自己实现的对称加密方法 var encryptedUserName = Encrypt(Request.Query["UserName"].ToString()); var encryptedPwd = Encrypt(Request.Query["Password"].ToString()); // 存入Redis,设置24小时过期 redisDb.StringSet($"WebhookBind:{bindId}", $"{encryptedUserName}|{encryptedPwd}", TimeSpan.FromHours(24)); // 后续将bindId拼接在Webhook回调地址中
读取参考代码:
var bindId = Request.Query["bindId"].ToString(); var encryptedValue = redisDb.StringGet($"WebhookBind:{bindId}"); if(string.IsNullOrEmpty(encryptedValue)){ // 无效请求直接返回 return BadRequest(); } // 拆分解密得到用户名密码 var accountInfo = encryptedValue.ToString().Split('|'); var userName = Decrypt(accountInfo[0]); var password = Decrypt(accountInfo[1]); // 后续数据库操作
2. 加密参数直接拼接回调地址
如果不想做持久化存储,可以直接把加密后的用户名密码拼接在给第三方的Webhook回调地址中:
- 必须使用强度足够的对称加密算法(比如AES),加密密钥仅存在服务端配置文件中,不要泄露
- 可以增加时间戳参数做有效期校验,避免回调地址被复用泄露敏感信息
示例回调地址:https://你的服务域名/Webhook/Callback?data=加密后的账号密码字符串×tamp=时间戳
注意事项
- 不要明文传递或存储用户名、密码这类敏感数据,必须做加密处理
- 不要尝试用Session、TempData这类会话绑定的存储方案给Webhook传值,完全不匹配场景
- Webhook接口需要增加请求合法性校验,避免恶意请求伪造调用
内容的提问来源于stack exchange,提问作者Kunal mandloi
相关产品推荐
相关产品推荐

