Клиент не будет подключаться к локальному локальному серверу SignalR при использовании Internet Explorer 11.

У нас есть собственный сервер SignalR (приложение Windows), который работает локально по адресу http://localhost:8080. У нас также есть отдельный веб-сайт со страницей, которая подключается к собственному серверу 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 пытается договориться, но соединение останавливается. Клиенту не возвращаются ошибки, и в конвейере концентратора нет ошибок (я включил ведение журнала и трассировку ошибок на сервере 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? Я ломал голову над этим и не могу найти решение. Любая помощь будет оценена по достоинству!

Спасибо


person TKelsey    schedule 07.08.2014    source источник
comment
это работает, если вы добавите http://mysite.azurewebsites.net в надежные сайты в IE?   -  person Pawel    schedule 08.08.2014


Ответы (1)


После дальнейших исследований я наткнулся на эту статью, которая привела меня к решению. Исправление состояло в том, чтобы выбрать

Настройки->Свойства обозревателя->Безопасность->Местная интрасеть->Сайты

и снимите флажок «Включить все локальные (интранет) сайты, не перечисленные в других зонах».

person TKelsey    schedule 12.08.2014