Webhook方法返回PartialView时ViewBag、Model、TempData均为空如何解决
问题解答
根本原因
webhook的调用链路和你预期的完全不一致,这是所有异常的核心:
- 你写的webhook接收方法是Square服务发起的独立HTTP POST请求,和用户浏览器端打开的你的网站页面属于完全隔离的两个请求上下文,没有任何关联
- 你在webhook方法中执行
return View("PartialView"),渲染后的视图内容是作为HTTP响应返回给Square服务器的,不会发送到用户的浏览器,自然不存在向你的网站页面前端传递数据的逻辑 - 方法为
async Task类型和该问题没有关联,不存在和前端JS线程冲突的问题
对应解决方案
场景1:需要将webhook收到的payload展示给正在访问网站的终端用户
采用服务端主动推送方案实现:
- 引入ASP.NET Core SignalR 或其他WebSocket方案,用户访问页面时和服务端建立长连接
- webhook接口收到Square的payload数据后,通过长连接将数据推送到对应用户的浏览器端
- 前端JS接收到推送数据后,手动渲染局部视图、更新页面内容即可
场景2:本地调试webhook接口,直接调用接口时返回视图数据为空
按以下规则排查修正:
- 确保视图传参写法正确:
// 传递模型的写法 return PartialView("PartialView", 你要传递的payload对象); // 传递ViewBag/TempData的写法 ViewBag.WebHookData = "come on man"; TempData["WebHookData"] = "test data"; return PartialView("PartialView");
- 检查webhook方法所在控制器是否加了
[ApiController]特性,或是存在全局过滤器在返回视图前清空了ViewData/TempData - 确认TempData配置正确,若使用Cookie存储需检查Cookie未被禁用,若使用Session存储需确认Session服务已正常启用
内容的提问来源于stack exchange,提问作者id10t
相关产品推荐
相关产品推荐

