【发布时间】:2018-05-01 00:56:24
【问题描述】:
我们有一个 ASP.NET Core 2.x 应用程序,它实现了在另一个(基于 Java 的)服务器/应用程序前充当代理的自定义中间件。此应用程序/中间件的客户端在服务器请求完成之前频繁中止/取消其请求是很常见的。
我们已将此应用程序部署到 IIS(作为反向代理)并在 Kestrel 上运行。 Prior to Core 2.x Kestrel had a bug that caused HttpContext.RequestAborted to always be false(其他相关问题here)...这显然已在 2.x 中修复(我已经能够确认)。
但是,当在 Kestrel 前面运行 IIS 时,它似乎不会将请求中止转发到 Kestrel 并且RequestAborted 仍然始终是false
有没有办法让RequestAborted 在这个配置中工作(或者如果没有的话,有任何其他方法可以检测到它)?
简单复现回购:https://github.com/mikeomeara1/RequestAbortRepro
更新
This Comment 似乎表明存在已知问题,但在很大程度上还不清楚
This Question 似乎也是相关的,但我也并不完全清楚它是直接相关的(至少它没有以这样的方式说明)。
@spender - 如果我理解正确,标题比较是here。如果没有,请告诉我,你想看什么我都会给你。
茶叶似乎表明存在已知问题。所以,问题是;有没有办法解决这个问题?我们刚刚经历了(非常痛苦的)1.1 到 2.x 的升级,希望这个问题能够得到解决,让我们的服务器再运行一个月/季度/年让我们在这一点上非常担心。我们正在开发的系统在体积上大大增加。
因此,欢迎任何变通办法、黑客或疯狂的想法。
【问题讨论】:
-
能否分享一下程序和启动类,以便我们判断您的代码是否一切正确?
-
无法共享该程序(它很大),但可以使用默认的 ASP.NET Core 模板轻松复制。在IIS Express下运行并取消加载页面,RequestAborted = False。在 Kestrel 下运行它,RequestAborted = True。我会考虑为它建立一个回购。
-
是否有可能检测不到中止?毕竟,如果客户端是流水线的(http1.1 重用相同的底层连接),那么中止的请求不一定是中止的连接。 IMO 有一个更大的问题,如果有这么多的用户在请求/响应中保释,可能会在另一个地方解决。
-
它是针对映射服务器的代理,它在缩放/平移后对请求进行保释。这可能会导致大量取消请求,具体取决于服务器渲染所需的时间。我也(部分)理解更大的 HTTP 协议问题……但事实是;单独使用 Kestrel 时,它可以按预期工作......而不是当 IIS 在它前面时。
-
比较来自两种不同场景的请求/响应标头可能会产生一些结果。我会对
Connection标头感兴趣。
标签: c# iis asp.net-core kestrel-http-server