我有一个在客户端服务器(W2k3、IIS6、.NET 2.0)上运行的 ASP.NET 应用程序。FWIW,这是一个测试实例,尚未移入生产环境。所以它不是在 SSL、负载平衡等下运行的。
当我从我们的办公室访问他们服务器上的一个页面时,该页面被点击一次。检查 IIS 日志 (c:WINDOWS\system32\LogFiles\W3SVC1) 显示该页面的 GET,然后我按下页面上的按钮,日志文件显示 POST。到目前为止,这似乎工作正常。
现在,当我远程进入客户端网络并从他们的一台本地计算机访问该页面时,日志文件显示一个 GET,然后我按下页面上的按钮,日志同时显示两个POST。第一个显示状态(sc-status,sc-substatus,sc-win32-status)200 0 64,第二个显示200 0 0。
在日志文件中,两个 POST 是相同的。基本上日志看起来像这样(除了我屏蔽了一些数据):
#Fields: 日期时间 s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status 2009-08-11 20:19:32 xxxx GET /File.aspx - 80 - yyyy Mozilla/4.0+(兼容;+MSIE+8.0;+Windows+NT+6.0;+WOW64;+Trident/4.0;+SLCC1; +.NET+CLR+2.0.50727;+.NET+CLR+3.5.21022;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30618;+MDDR;+OfficeLiveConnector.1.4;+OfficeLivePatch .0.0) 200 0 0 2009-08-11 20:19:45 xxxx POST /File.aspx - 80 - yyyy Mozilla/4.0+(兼容;+MSIE+8.0;+Windows+NT+6.0;+WOW64;+Trident/4.0;+SLCC1; +.NET+CLR+2.0.50727;+.NET+CLR+3.5.21022;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30618;+MDDR;+OfficeLiveConnector.1.4;+OfficeLivePatch .0.0) 200 0 64 2009-08-11 20:19:45 xxxx POST /File.aspx - 80 - yyyy Mozilla/4.0+(兼容;+MSIE+8.0;+Windows+NT+6.0;+WOW64;+Trident/4.0;+SLCC1; +.NET+CLR+2.0.50727;+.NET+CLR+3.5.21022;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30618;+MDDR;+OfficeLiveConnector.1.4;+OfficeLivePatch .0.0) 200 0 0
问题是,页面被点击了两次。数据库对第一个请求执行操作,然后第二个请求检测到正在执行重复操作并抛出错误消息。用户认为他们的操作失败了,但实际上成功了。
sc-win32-status 64的错误描述是:“指定的网络名不再可用。” 这让我相信,鉴于两个 POST 请求都显示 HTTP 状态为 200,服务器成功地处理了请求,但客户端从未收到通知并重新提交请求。
我该如何解决这个问题?
有什么想法可能仅在其内部网络上导致这种行为吗?
我应该提到,这发生在两个单独的客户站点,但不会发生在我们的其他六个客户站点,或在我们的办公室,或通过网络连接到我们的八个客户中的任何一个。
是什么让这种在本地网络上 100% 的时间可重现,但在其他任何地方的时间为 0%?
更新:我发现极少数重复的 POST 请求的 sc-win32-status 为 995,而不是最初报告的 64。sc-win32-status=995 的错误描述是:“由于线程退出或应用程序请求,I/O 操作已中止。” 这没有任何意义(考虑到我可以完全访问代码)。我仍然不明白这个问题是如何或为什么会发生的,但新的错误代码让我相信它毕竟可能不是网络问题,我现在正在调查随机代码错误的可能性。
到目前为止,这是我对这个问题的理解:
更新:我在这里和这里发现了一些有趣的信息,所以我基本上重写了页面以确保没有任何错误的标记等......问题现在消失了!这只是在黑暗中的一个镜头,我不能肯定地说是什么解决了这个问题,因为它只在一些非常特殊的情况下影响了我们的一些客户......
尝试通过代理服务器从 IIS6 提供 gzip 后的二进制文件时,我遇到了同样的问题。直接访问网站时我没有遇到任何问题。
通过在客户端机器上运行Fiddler并检查响应,我发现这就是我的原因。Fiddler 警告响应已编码,然后抱怨 gzip 文件上的幻数不正确。
我在我的代码中关闭了二进制文件的 gzip 压缩,并且问题停止发生。