【问题标题】:Kestrel + IIS Reverse Proxy RequestAborted Not TriggeredKestrel + IIS 反向代理请求中止未触发
【发布时间】: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


【解决方案1】:

这是一个已知问题,尚未修复。见https://github.com/aspnet/AspNetCoreModule/issues/38

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2021-07-10
    • 2018-11-22
    • 2020-02-20
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多