使用Internet Explorer 11时,客户端将无法连接到本地自托管SignalR服务器

时间:2014-08-07 23:46:18

标签: internet-explorer azure cross-domain signalr signalr-hub

我们有一个在http://localhost:8080本地运行的自托管SignalR服务器(Windows应用程序)。我们还有一个单独的网站,其页面通过集线器连接到自托管SignalR服务器。当网站托管在我的本地计算机上时,客户端就可以很好地连接到SignalR服务器。只要将网站部署到Azure服务器,客户端页面就不再连接到本地SignalR服务器。

我们正在使用SignalR版本2.1.1和JQuery 2.1.1。

奇怪的是,问题只发生在IE中(我们使用的是版本11)。当本地托管具有客户端的网站时,IE将正常工作,但当网站托管在云中时,IE将无法工作。使用Chrome(最新版本)时,无论网站托管在何处,客户端都将进行连接。

起初我认为这只是一个CORS问题,所以我研究了我能找到的所有内容,并尝试了这里推荐的所有内容以及其他地方,但无济于事。

这是IE控制台日志(来自$ .connection.hub.logging = true),用于客户端页面在Azure中托管的情况(客户端不会连接):

HTML1300: Navigation occurred.
File: comlinktestharness.html
[16:18:03 GMT-0500 (Central Daylight Time)] SignalR: Auto detected cross domain url.
[16:18:03 GMT-0500 (Central Daylight Time)] SignalR: Client subscribed to hub 'comlinkhub'.
[16:18:03 GMT-0500 (Central Daylight Time)] SignalR: Negotiating with 'http://localhost:8080/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22comlinkhub%22%7D%5D'.
[16:18:03 GMT-0500 (Central Daylight Time)] SignalR: Stopping connection.

这是相应的Fiddler追踪:

GET http://mysite.azurewebsites.net/testharness/comlinktestharness.html
200 OK (text/html)
GET http://mysite.azurewebsites.net/Scripts/jquery-2.1.1.min.js
200 OK (application/x-javascript)
GET http://mysite.azurewebsites.net/Scripts/jquery.signalR-2.1.1.min.js
200 OK (application/x-javascript)
GET http://localhost:8080/signalr/hubs
200 OK (application/javascript)

如您所见,IE客户端尝试协商,但连接已停止。没有错误返回给客户端,并且Hub管道中没有抛出任何错误(我已在SignalR服务器上启用了错误记录和跟踪)。

以下是适用场景的IE控制台日志(当客户端网站在本地托管时):

[16:51:12 GMT-0500 (Central Daylight Time)] SignalR: Auto detected cross domain url.
[16:51:12 GMT-0500 (Central Daylight Time)] SignalR: Client subscribed to hub 'comlinkhub'.
[16:51:12 GMT-0500 (Central Daylight Time)] SignalR: Negotiating with 'http://localhost:8080/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22comlinkhub%22%7D%5D'.
[16:51:12 GMT-0500 (Central Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:8080/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAL6z3nwT%2FfU%2BsVLkmYFEbFAAAAAACAAAAAAAQZgAAAAEAACAAAABBbno6Hw%2FRMgCwrkTmBB0yFdPD1pbLdlxqybV%2FIaio8QAAAAAOgAAAAAIAACAAAAC%2BS5tItVzar1XbLz2znCKXNaCnrW%2FdOYCPjFFV0HcUgDAAAACwab%2F5nGEG6iOLb2yGa8wXdQw%2Bl7T1dF60mArUv9GveCf7PpDJ6eHjlrPh3ePuRKdAAAAAkOqGRkWggu1zFBjUOXjHfW0St8EJ3EL%2B4lKNhLjFMnzh5ER48ZkaF42XN0HN3idX8834Xbp5RlFJy6ljE0npuA%3D%3D&connectionData=%5B%7B%22name%22%3A%22comlinkhub%22%7D%5D&tid=10'.
[16:51:12 GMT-0500 (Central Daylight Time)] SignalR: Websocket opened.
[16:51:12 GMT-0500 (Central Daylight Time)] SignalR: webSockets transport selected. Initiating start request.
[16:51:12 GMT-0500 (Central Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state.
[16:51:12 GMT-0500 (Central Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000.

以下是成功方案的相应Fiddler跟踪:

POST http://localhost:8080/signalr/abort?transport=webSockets&clientProtocol=1.4&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAL6z3nwT%2FfU%2BsVLkmYFEbFAAAAAACAAAAAAAQZgAAAAEAACAAAADwU6H8SJ5n8MePxQmgfQrUbS55oh8ENsX0QPGOufSSUQAAAAAOgAAAAAIAACAAAAC6hHjHaQhxYWGrx5US2q%2FWVIcB34cfcHf0xEX1mY6AqzAAAABatf%2ByMhKKTc%2FLtakiTcuw5XIeAGczBVKQTcXHcRxNJ5my4DR9ec%2BkyBhh0us6Ql5AAAAAkZ18xiOkPzVingDTOcGOXVZziJcSUXfTYn03zIUnbuYAPj8TS5LD3LZ9s9eT4vqNwRFrQ2orA8k3dTtw5NJK%2BQ%3D%3D&connectionData=%5B%7B%22name%22%3A%22comlinkhub%22%7D%5D
200 OK ()
GET http://localhost:54792/TestHarness/ComLinkTestHarness.html
200 OK (text/html)
GET http://localhost:54792/Scripts/jquery-2.1.1.min.js
200 OK (application/javascript)
GET http://localhost:8080/signalr/hubs
200 OK (application/javascript)
GET http://localhost:54792/Scripts/jquery.signalR-2.1.1.min.js
200 OK (application/javascript)
GET http://localhost:54792/favicon.ico
200 OK (image/x-icon)
GET http://localhost:8080/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22comlinkhub%22%7D%5D&_=1407448272112
200 OK (application/json)
CONNECT http://localhost:8080
200 Connection Established ()
GET http://localhost:8080/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAL6z3nwT%2FfU%2BsVLkmYFEbFAAAAAACAAAAAAAQZgAAAAEAACAAAABBbno6Hw%2FRMgCwrkTmBB0yFdPD1pbLdlxqybV%2FIaio8QAAAAAOgAAAAAIAACAAAAC%2BS5tItVzar1XbLz2znCKXNaCnrW%2FdOYCPjFFV0HcUgDAAAACwab%2F5nGEG6iOLb2yGa8wXdQw%2Bl7T1dF60mArUv9GveCf7PpDJ6eHjlrPh3ePuRKdAAAAAkOqGRkWggu1zFBjUOXjHfW0St8EJ3EL%2B4lKNhLjFMnzh5ER48ZkaF42XN0HN3idX8834Xbp5RlFJy6ljE0npuA%3D%3D&connectionData=%5B%7B%22name%22%3A%22comlinkhub%22%7D%5D&tid=10
101 Switching Protocols ()
GET http://localhost:8080/signalr/start?transport=webSockets&clientProtocol=1.4&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAL6z3nwT%2FfU%2BsVLkmYFEbFAAAAAACAAAAAAAQZgAAAAEAACAAAABBbno6Hw%2FRMgCwrkTmBB0yFdPD1pbLdlxqybV%2FIaio8QAAAAAOgAAAAAIAACAAAAC%2BS5tItVzar1XbLz2znCKXNaCnrW%2FdOYCPjFFV0HcUgDAAAACwab%2F5nGEG6iOLb2yGa8wXdQw%2Bl7T1dF60mArUv9GveCf7PpDJ6eHjlrPh3ePuRKdAAAAAkOqGRkWggu1zFBjUOXjHfW0St8EJ3EL%2B4lKNhLjFMnzh5ER48ZkaF42XN0HN3idX8834Xbp5RlFJy6ljE0npuA%3D%3D&connectionData=%5B%7B%22name%22%3A%22comlinkhub%22%7D%5D&_=1407448272113
200 OK (application/json)

正如我之前提到的,这只是IE中的一个问题......无论客户网站的托管位置如何,Chrome都能正常运作。

以下是SignalR服务器的启动和集线器代码:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());
        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
            };
            map.RunSignalR(hubConfiguration);
        });
    }
}

public class ComLinkHub : Hub
{
    public void SendEid(string eid)
    {
        Clients.All.eidChanged(eid);
    }
}

最后,这是客户端网页的代码:

$(function () {
    $.connection.hub.url = "http://localhost:8080/signalr";

    var chat = $.connection.comLinkHub;

    chat.client.eidChanged = function (message) {
        // Handle server message
    };

    $.connection.hub.logging = true;

    $.connection.hub.start().done(function () {
        // Do something
    });
});

任何人都可以告诉我为什么这在Chrome中运行但在IE 11中不起作用?我在这个问题上绞尽脑汁,无法找到解决方案。任何帮助将不胜感激!

由于

1 个答案:

答案 0 :(得分:1)

经过进一步的研究,我遇到了这个article,这让我找到了解决方案。修复是选择

设置 - >互联网选项 - >安全性 - >本地内部网 - >网站

并取消选中"包括未在其他区域中列出的所有本地(内部网)网站"。