提问人:Erik Westwig 提问时间:6/4/2023 更新时间:6/6/2023 访问量:294
Azure 上的服务器端事件响应缓冲问题(ASP.net 核心 Web 应用)
Server-Side Event Response Buffering Issues on Azure (ASP.net Core Web App)
问:
为了试验服务器端事件和核心 asp.net,我编写了一个简单的 Web 应用程序来制作一个基本的聊天窗口。发布到服务器是通过使用 fetch 的简单 AJAX 调用完成的,客户端使用服务器端事件接收数据。在我的本地计算机上一切正常,但是当我将内容发布到 Azure 时,我发现响应偶尔会到达客户端,通常等待第二个聊天帖子出现。
在为此挠头了一段时间后,我终于假设在 Azure 上执行了一些额外的响应缓冲,而这些缓冲不会在我的本地计算机上发生。在每篇文章之后,我都写了大量的虚拟数据,这个实验确实解决了这个问题,为我的理论提供了一些支持。
在网上搜索了一下,我找到了几篇文章,证实了我的怀疑。例如:https://learn.microsoft.com/en-us/azure/api-management/how-to-server-sent-events。它特别提到:“关闭转发请求策略上的响应缓冲,以便立即将事件中继到客户端。
我对 Azure 以及除了最基本的东西之外的任何内容的工作方式都一无所知。我试图弄清楚上面的文章(以及其他类似的文章)是否与我相关。我编写了一个 WebApp 并发布了它,但这些文章引用了“API 管理实例”,该实例不是在我发布应用时创建的。
所以,我们终于得出了问题:
尽管我的应用程序实际上没有 API,但我是否需要创建 API 管理实例事件?
如果我确实关闭了此缓冲,是否可以仅为 SSE 流而不是整个应用程序关闭它?
或
- 我是不是吠错了树,有更好的方法来解决这个问题?
答:
我最终确实自己弄清楚了这一点。答案是#3:我吠错了树。
简单的答案是在服务器端事件中间件中禁用缓冲。也就是说,在我的 SSE 中间件代码的开头,我添加了以下代码:
var responseBodyFeature = context.Features.Get<IHttpResponseBodyFeature>();
if (responseBodyFeature != null) responseBodyFeature.DisableBuffering();
虽然我无法解释在我的本地计算机上没有这些行,但在 Azure 应用服务上失败了......有了这个额外的代码,一切都可以在两个位置正常工作。
评论