gpt4 book ai didi

重新审视 GWT-RPC 和臭名昭著的零星 "StatusCodeException: 0"异常

转载 作者:行者123 更新时间:2023-12-04 11:37:48 27 4
gpt4 key购买 nike

我的问题是 infamous "StatusCodeException: 0"使用 时出现的问题GWT 2.6.1 通过子域访问页面时https://sub.site.com/ .

现在,这很容易发生偶尔 一位客户 使用 IE11 和 我无法重现 这是来自使用 IE11、IE10、IE9 或 IE8 的几台不同计算机(更不用说 Chrome 或 Firefox)。

https://site.com/ 访问完全相同的 webapp似乎对那个客户工作正常。

这显然让我得出结论,我遇到了 Same Origin Policy 的问题。 .

奇怪的是,我的 webapp设计以这种方式 无跨域跨子域提出请求。 也是如此无交叉协议(protocol) 还有无跨端口要求。换句话说,同源政策在这种情况下不违反。作为确认,我可以提供以下证据:

While being at customer site I've seen how this is reproduced: customer starts using application and everything works fine - all requests are returning response normally. Then, after several minutes of working, exactly the same requests on the same page (without reloads) starts to fail with StatusCodeException: 0.



基本上,两者都是 https://sub.site.comhttps://site.com指向同一个IP,还有 只有一个Tomcat webapp https://sub.site.com 提供完全相同的资源和 https://site.com .

另一个证据是单个 GWT 模块本身的代码库:我只使用了一个名为 DashboardService 的服务实例。 :
public class DashboardModule extends EntryPoint implements IDashboardModule {

private final DashboardServiceAsync dashboardService = createDashboardService();

@Override
public void onModuleLoad() {
// loading of module elements
// dashboardService is passed as a parameter so only one instance is used
}

/**
* PLEASE SEE QUESTION #1 BELOW CODE SNIPPET
*/
private static final String DASHBOARD_REQUEST_URL = "request";

private static DashboardServiceAsync createDashboardService() {
final DashboardServiceAsync service = GWT.create(DashboardService.class);
((ServiceDefTarget) service).setServiceEntryPoint(DASHBOARD_REQUEST_URL);
return service;
}
}

==================================== 编辑 ============== ======================

在客户位置查看控制台后,错误始终如下:

SCRIPT7002:XmlHttpRequest:网络错误 0x2ee4,...

所以这似乎与 无关同源政策 ,因为根据 this article它被描述为 ERROR_INTERNET_INTERNAL_ERROR An internal error has occurred.
很遗憾,但我发现只有 2 个没有解决此错误的提及:
Error under IE10Error under IE11 .

我有一个假设,客户很可能通过一些代理访问站点,这会稍微改变请求,而 IE 无法处理它们。

问题一:有人知道如何在本地模拟或重现提到的错误吗?

问题2:有谁知道如何优雅地解决这个问题?

问题三:是否可以简单地重试请求,或者该请求可能已经到达服务器并对其进行了修改,因此重试可能会产生重复的修改?

将尝试设置转发代理以模拟可能的客户设置以至少重现提到的错误...

我非常感谢任何帮助!

最佳答案

好的,所以在解决这个问题一个工作周后,我终于设法解决了它。

实际上,当我在 Tomcat 前面安装 Apache2 服务器并从另一个带有 IE11 的 VirtualBox Win7 主机访问它时,我能够在本地重现非常相似的问题。虽然这给了我带有 StatusCodeException: 0 的零星 Network error 0x2ef3 但行为非常相似:GWT-RPC 请求在一分钟左右后开始失败。这在 IE10 和 IE11 中是可重现的,但在 IE8 和 IE9 中工作正常:)( IE 在新版本中变得更糟糕了吗?)

本地 通过在 Keep-alive Apache2 ssl 配置文件中添加以下行,我能够通过简单地禁用 IE 浏览器的 /etc/apache2/sites-enabled/default-ssl.conf 功能来解决该问题:

    # following line was added
BrowserMatch "Trident" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

</VirtualHost>
</IfModule>

这基本上告诉 Apache2 不要使用 keep-alive ,使用 特殊的 SSL 处理,并且通常在请求中的 user-agent 字符串具有 Trident 字(匹配 IE11 和 IE10 以及可能更早的 IE)时降级到 HTTP 1.0 标准

这将 Connection: close HTTP header 添加到每个响应中,并且在本地 似乎工作正常。

在客户网站上,这仍然无法正常工作并产生相同的 Network error: 0x2ee4

值得注意的是,客户使用 McAfee Web Gateway 作为转发代理,它位于浏览器 <-> 服务器通信的中间。

长话短说,我发现问题在于:当页面加载时,有多个 GET 请求被发送到服务器以获取页面、资源等。然后在使用它 10 秒后(我的 webapp 是单-页面应用程序,因此用户可能会在同一页面上花费超过 10 分钟)只有 GWT-RPC 请求正在向服务器发出,这些请求是 POST 请求。使用此页面一分钟后(我怀疑 1 分钟 = 代理服务器的 keep-alive timeout),这些 POST 请求开始随机失败,出现 0x2ee4 网络错误。

在我实现 GWT-RPC 重试功能后,我发现重试 30 秒后 ALL GWT-RPC 请求失败并出现上述错误。刷新页面一分钟左右再次解决了这个问题,然后同样的故事发生了。

所以,我发现 CRAPPY IE11 和 IE10 错误地处理了 SSL、Keep-alive 和 POST 请求 的组合。似乎 和 IE10 和 IE11 根本无法使用 POST 请求更新保持事件的 ssl 连接,只能使用 GET 请求执行此操作。
请注意,Chrome、Firefox 和其他普通浏览器可以很好地处理这种情况。在 Firebug 中检查 Firefox 在这种情况下的行为时:可以清楚地看到发出 POST 请求,然后显示为中止约 0.5 秒,然后显示为成功(我怀疑 Firefox 处理了这种特定情况,并且向服务器本身发出 GET 请求以更新 SSL 保持事件连接,然后重试 POST 请求)

所以,为了在 IE 中解决这个问题,我只是实现了每 5 秒用 GET 请求“ping”服务器的功能(准备好这次试验,因为这很可能与客户的代理 keep-alive 超时有关)。

这使它工作(请注意,在这种情况下不需要上面的 Apache2 配置 hack)

我真的希望这能帮助有类似问题的人并节省他们的时间

使用的资源:
  • IE Network Error 0x2ef3 question 1
  • IE Network Error 0x2ef3 question 2
  • IE Network Error 0x2ef3 question 3
  • Awesome q&a on how to implement transparent GWT-RPC retry functionality

  • 附注 我会向微软报告这个 IE10 和 IE11 问题吗? - 在我已经花了一个多星期找出问题之后,我真的不急于花费 30 多分钟的时间来报告商业蹩脚的 IE 浏览器问题。

    我对坚持推荐的Chrome 火狐其他正常的浏览器以客户为可行的选择,我仍然认为 IE11不适合现代的网站使用AJAX

    关于重新审视 GWT-RPC 和臭名昭著的零星 "StatusCodeException: 0"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25035780/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com