问题
我们有一个 Web 应用程序,有成千上万的用户在使用。但是,自 2020 年 1 月下旬以来,一小部分客户(但数量仍然很大)报告了类似的问题。
- 无法执行 AJAX POST (application/json)
- 能够执行 AJAX GETS
- 能够执行 AJAX POSTS (application/x-www-form-urlencoded)
- 不依赖于特定的浏览器
- 影响客户端网络中的所有用户
Web 方法(ASP.NET MVC)不需要对用户进行身份验证,也不需要 HTTPS。
客户分析
使用 Google Chrome 的“网络”选项卡,我们将数据捕获为 HAR 文件。对于被阻止的请求,我们看到:
"timings": {
"blocked": 0.06441399999312125,
"dns": -1,
"ssl": -1,
"connect": -1,
"send": 0,
"wait": 0,
"receive": 0,
"_blocked_queueing": -1
},
我将其解释为,这必须等待其他 AJAX 调用完成(它被阻止)但它从未发送请求。
Web服务器分析
我们在网络服务器上安装了 WireShark,并在记录 HAR 文件的同时捕获了流量。
客户(来源)被描述为思科。
对于失败的请求,我们看到以下帧:
1. Client->Server: 18497 -> 80 [SYN, ECN, CWR]
2. Server->Client: 80 -> 18479 [SYN, ACK, ECN]
3. Client->Server: 18497 -> 80 [ACK]
4. Client->Server: 18497 -> 80 [RST, PSH, ACK]
前三帧看起来与成功的 Posts 非常相似,但在这里我们得到客户端返回 [RST,PSH,ACK],而成功的则没有。
我看了一下 2. (服务器->客户端),对于成功和失败的情况,这些看起来非常相似,尽管我承认我是一名.NET 软件开发人员,并且对 TCP 级别不太熟悉......
调查来自客户端的 [RST、PSH、ACK],我确实在标志部分下看到以下内容:
[Expert Info (Warning/Sequence): Connection reset (RST)]
[Connection reset (RST)]
[Severity level: Warning]
[Group: Sequence]
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: .......APR..]
我不知道是什么原因导致这个请求被终止:这是我们在服务器/负载均衡器/防火墙上做错的事情导致客户端重置连接,还是客户端配置不正确?