除非在本地访问IIS站点,否则SignalR ForeverFrame传输不起作用

时间:2017-06-21 20:22:48

标签: c# asp.net iis signalr forever-frame

我有一个基于SignalR的.NET 4.5应用程序。服务器后端是用C#编写的,我只有连接到我的集线器的Javascript客户端。目前我正在测试最新的SignalR版本2.2.2。

我的应用程序通常托管在较旧的Windows Server 2008 R2和IIS 7.5上,我的用户也在IE10或IE11上。这会减少对foreverFrame和longPolling的可用传输。

最近我们开始接收有关JS客户端断开连接的更多报告。 我很快注意到ForeverFrame根本不再工作,所有JS客户端都在使用longPolling。

这个问题现在特别关于ForeverFrame无法正常工作(如果需要,我会发布一个关于longPolling问题的单独问题)。

以下是我如何重现问题(foreverFrame传输无法正常工作):

  • 我的应用程序在Windows Server 2008 R2& IIS 7.5(服务器 经常修补安全和关键补丁)
  • 使用IE11访问我的测试页
  • 远程连接(换句话说,不是从服务器本地连接)
  • 在控制台中我看到: SignalR:foreverFrame传输在尝试连接时超时。"
  • SignalR回退到longPolling,启动正常
  • 在集线器端,我覆盖了OnConnected和OnDisconnected,有趣的是我没有看到OnConnected触发,但OnDisconnected正在触发
  • 在“开发者工具网络”标签中,我看到(Abort)for foreverFrame:
  

URL协议方法结果类型已接收启动器等待启动请求响应缓存读取间隙   /MMCI/signalr/connect?transport=foreverFrame&clientProtocol=1.5&connectionToken=4MQ9IexTBePfDa7ilqJuKLoxAW5cpgSSK171zjD18vmXtdEKNEIWyFnFYYWlEKjTt49Ou9lLps961D3LTMxGNzW0GzIlBsLtmIA%2BgVQZz0nL71f6fK6jkfrOn5dcHoyz&connectionData=%5B%5D&tid=10&frameId=1 HTTP(中止)0 B< 1 ms帧导航484 0 0 0 0 5335

有趣的是如果我在本地连接,则不会发生此问题。我甚至可以在本地的旧服务器上使用IE8,foreverFrame启动OK。或者我可以在我的笔记本电脑上本地使用IE11并在IIS Express上运行我的应用程序,一切都很好。但是当我远程浏览我的网站时,foreverFrame无法启动。

这里有什么值得我的ConnectionTest.html的代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <title>SignalR Connection Test</title>
  <script src="Scripts/jquery-1.12.4.min.mjs"></script>
  <script src="Scripts/jquery.signalR-2.2.2.min.mjs"></script>
  <script src="signalr/hubs"></script>
  </head>
  <body>
    <script type="text/javascript">
      $(function () {
        var chat = $.connection.MMCIChatHub; // Declare a proxy to reference the hub
        $.connection.hub.logging = true;
        $.connection.hub.start({ transport: ['webSockets', 'foreverFrame', 'longPolling'] })
                                                                    .done(function () {
            //Observe console and network tabs in Developer Tools
        });
    });
    </script>
  </body>
</html>

在刷新我的测试页时,这里也是IE11的完整调试控制台输出:

HTML1300: Navigation occurred.
File: ConnectionTest.html
[23:30:52 GMT+0300 (FLE Daylight Time)] SignalR: Window unloading, stopping the connection.
[23:30:52 GMT+0300 (FLE Daylight Time)] SignalR: Stopping connection.
[23:30:52 GMT+0300 (FLE Daylight Time)] SignalR: Aborted xhr request.
[23:30:52 GMT+0300 (FLE Daylight Time)] SignalR: Fired ajax abort async = false.
[23:30:53 GMT+0300 (FLE Daylight Time)] SignalR: No hubs have been subscribed to.  
                                                    The client will not receive data from hubs.  
                                                    To fix, declare at least one client side 
                                                    function prior to connection start for each 
                                                    hub you wish to subscribe to.
[23:30:53 GMT+0300 (FLE Daylight Time)] SignalR: Negotiating with '/MMCI/signalr/negotiate?clientProtocol=1.5
                                                    &connectionData=%5B%5D'.
[23:30:53 GMT+0300 (FLE Daylight Time)] SignalR: foreverFrame transport starting.
[23:30:53 GMT+0300 (FLE Daylight Time)] SignalR: Binding to iframe's load event.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: foreverFrame transport timed out when trying to connect.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: Stopping forever frame.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: foreverFrame transport failed to connect. Attempting to fall back.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: longPolling transport starting.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: Opening long polling request to 
                                                    'http://217.77.198.140/MMCI/signalr/connect?transport=longPolling&
                                                    clientProtocol=1.5&connectionToken=y3tVestYFcE9jSYGTtsg5PL9tkVRmuKE1a%2F
                                                    yd%2BllR6ZwaNzXO3%2BI%2F
                                                    wGZfYTp9k4xzqy2Wb4mwxAawmfwG3Nh0c4Hq9LG75qDGtjk0FZ1hPUecK0udIUt2bay%2B
                                                    EfCKcAL&connectionData=%5B%5D'.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: Long poll complete.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: LongPolling connected.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: longPolling transport connected. Initiating start request.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: Opening long polling request to 
                                                    'http://217.77.198.140/MMCI/signalr/poll?transport=longPolling&
                                                    clientProtocol=1.5&connectionToken=y3tVestYFcE9jSYGTtsg5PL9tkVRmuKE1a%2F
                                                    yd%2BllR6ZwaNzXO3%2BI%2F
                                                    wGZfYTp9k4xzqy2Wb4mwxAawmfwG3Nh0c4Hq9LG75qDGtjk0FZ1hPUecK0udIUt2bay%2B
                                                    EfCKcAL&connectionData=%5B%5D'.
[23:30:58 GMT+0300 (FLE Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state.

以下是从服务器本身访问本地相同的URL时IE8的输出(在我的笔记本电脑上使用IE11和IIS Express在本地发生相同的结果):

LOG: [23:35:16 UTC+0300] SignalR: Window unloading, stopping the connection.
LOG: [23:35:16 UTC+0300] SignalR: Stopping connection.
LOG: [23:35:16 UTC+0300] SignalR: Stopping forever frame.
LOG: [23:35:16 UTC+0300] SignalR: Fired ajax abort async = false.
LOG: [23:35:16 UTC+0300] SignalR: Stopping the monitoring of the keep alive.
LOG: [23:35:16 UTC+0300] SignalR: No hubs have been subscribed to.  The client will not receive data from hubs.  
                                                    To fix, declare at least one client side function prior to connection 
                                                    start for each hub you wish to subscribe to.
LOG: [23:35:16 UTC+0300] SignalR: Negotiating with '/MMCI/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%5D'.
LOG: [23:35:16 UTC+0300] SignalR: foreverFrame transport starting.
LOG: [23:35:16 UTC+0300] SignalR: Binding to iframe's load event.
LOG: [23:35:16 UTC+0300] SignalR: Iframe transport started.
LOG: [23:35:16 UTC+0300] SignalR: foreverFrame transport connected. Initiating start request.
LOG: [23:35:16 UTC+0300] SignalR: The start request succeeded. Transitioning to the connected state.
LOG: [23:35:16 UTC+0300] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive 
                                                    timeout of 20000 and disconnecting timeout of 30000

所以....任何想法? :)

更新 我能够反过来测试:从使用IE8的Win2008R2服务器连接到笔记本电脑上的IIS Express。在这种情况下,ForeverFrame完全启动。所以目前这似乎是一个IE11问题。试图找出如何进一步调试......

更新2: 经过更多测试后,我得出的结论是,当以下所有条件都成立时,foreverFrame不起作用:

  • 使用IE11的Win 7工作站
  • 连接到远程站点(意思不是localhost)
  • 使用网址中的IP地址进行连接

但是,如果满足以下任何条件,那么nowFrame似乎立即起作用:

  • 连接到localhost而不是远程服务器,或
  • 使用更高版本的Windows版本(但仍然是IE11)或
  • 使用FQDN而不是IP地址进行连接。

非常非常奇怪...... 我还发布了ASP.NET论坛,IE11论坛和IE11开发者论坛,但没有真正的帮助。我现在决定不再深入研究这个问题了。 我也不会进一步调查longPolling问题。 我刚刚编写了自己的心跳机制和连接重启处理程序......

所以这个问题仍然没有答案,但对我来说不再是一个真正的问题。

更新3: 不幸的是,我不再有可能使用较旧的操作系统Win 7或Win Server 2008进行测试。此外,我已更新至最新的SignalR。 所以这个问题仍然是一个谜,但我不再需要答案了。

0 个答案:

没有答案