From 54c71c4c103e0406e5f6b8ee39c1a3e5e93b61de Mon Sep 17 00:00:00 2001 From: Pawel Kadluczka Date: Mon, 11 Sep 2017 16:26:10 -0700 Subject: [PATCH] Replacing Cache-Control header with nonce Makes long polling work on IE10 and IE9 --- .../Transports.ts | 6 +-- .../wwwroot/js/common.js | 12 ++++- .../wwwroot/js/connectionTests.js | 42 ++++++++-------- .../wwwroot/js/webSocketTests.js | 48 ++++++++++--------- 4 files changed, 60 insertions(+), 48 deletions(-) diff --git a/client-ts/Microsoft.AspNetCore.SignalR.Client.TS/Transports.ts b/client-ts/Microsoft.AspNetCore.SignalR.Client.TS/Transports.ts index fe740cf66f..47ab138b6e 100644 --- a/client-ts/Microsoft.AspNetCore.SignalR.Client.TS/Transports.ts +++ b/client-ts/Microsoft.AspNetCore.SignalR.Client.TS/Transports.ts @@ -247,12 +247,12 @@ export class LongPollingTransport implements ITransport { } this.pollXhr = pollXhr; - this.pollXhr.open("GET", url, true); + + this.pollXhr.open("GET", `${url}&_=${Date.now()}`, true); if (transferMode === TransferMode.Binary) { this.pollXhr.responseType = "arraybuffer"; } - // IE caches xhr requests - this.pollXhr.setRequestHeader("Cache-Control", "no-cache"); + // TODO: consider making timeout configurable this.pollXhr.timeout = 120000; this.pollXhr.send(); diff --git a/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/common.js b/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/common.js index eeae3d9c6b..237b46e6f9 100644 --- a/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/common.js +++ b/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/common.js @@ -6,7 +6,10 @@ var ECHOENDPOINT_URL = "http://" + document.location.host + "/echo"; function getTransportTypes() { - var transportTypes = [signalR.TransportType.WebSockets]; + var transportTypes = []; + if (typeof WebSocket !== "undefined") { + transportTypes.push(signalR.TransportType.WebSockets); + } if (typeof EventSource !== "undefined") { transportTypes.push(signalR.TransportType.ServerSentEvents); } @@ -22,7 +25,12 @@ function eachTransport(action) { } function eachTransportAndProtocol(action) { - var protocols = [new signalR.JsonHubProtocol(), new signalRMsgPack.MessagePackHubProtocol()]; + var protocols = [new signalR.JsonHubProtocol()]; + // IE9 does not support XmlHttpRequest advanced features so disable for now + // This can be enabled if we fix: https://github.com/aspnet/SignalR/issues/742 + if (typeof new XMLHttpRequest().responseType === "string") { + protocols.push(new signalRMsgPack.MessagePackHubProtocol()); + } getTransportTypes().forEach(function (t) { return protocols.forEach(function (p) { return action(t, p); diff --git a/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/connectionTests.js b/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/connectionTests.js index da387cc182..1f3ee9574b 100644 --- a/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/connectionTests.js +++ b/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/connectionTests.js @@ -4,30 +4,32 @@ "use strict"; describe('connection', function () { - it("can connect to the server without specifying transport explicitly", function (done) { - var message = "Hello World!"; - var connection = new signalR.HttpConnection(ECHOENDPOINT_URL); + if (typeof WebSocket !== 'undefined') { + it("can connect to the server without specifying transport explicitly", function (done) { + var message = "Hello World!"; + var connection = new signalR.HttpConnection(ECHOENDPOINT_URL); - var received = ""; - connection.onDataReceived = function (data) { - received += data; - if (data == message) { - connection.stop(); - } - }; + var received = ""; + connection.onDataReceived = function (data) { + received += data; + if (data == message) { + connection.stop(); + } + }; - connection.onClosed = function (error) { - expect(error).toBeUndefined(); - done(); - }; + connection.onClosed = function (error) { + expect(error).toBeUndefined(); + done(); + }; - connection.start().then(function () { - connection.send(message); - }).catch(function (e) { - fail(); - done(); + connection.start().then(function () { + connection.send(message); + }).catch(function (e) { + fail(); + done(); + }); }); - }); + } eachTransport(function (transportType) { it("over " + signalR.TransportType[transportType] + " can send and receive messages", function (done) { diff --git a/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/webSocketTests.js b/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/webSocketTests.js index 12a26d2e7c..6fb6bc86ef 100644 --- a/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/webSocketTests.js +++ b/client-ts/Microsoft.AspNetCore.SignalR.Test.Server/wwwroot/js/webSocketTests.js @@ -3,33 +3,35 @@ 'use strict'; -describe('WebSockets', function () { - it('can be used to connect to SignalR', function (done) { - var message = "message"; +if (typeof WebSocket !== 'undefined') { + describe('WebSockets', function () { + it('can be used to connect to SignalR', function (done) { + var message = "message"; - var webSocket = new WebSocket(ECHOENDPOINT_URL.replace(/^http/, "ws")); + var webSocket = new WebSocket(ECHOENDPOINT_URL.replace(/^http/, "ws")); - webSocket.onopen = function () { - webSocket.send(message); - }; + webSocket.onopen = function () { + webSocket.send(message); + }; - var received = ""; - webSocket.onmessage = function (event) { - received += event.data; - if (received === message) { - webSocket.close(); - } - }; + var received = ""; + webSocket.onmessage = function (event) { + received += event.data; + if (received === message) { + webSocket.close(); + } + }; - webSocket.onclose = function (event) { - if (!event.wasClean) { - fail("connection closed with unexpected status code: " + event.code + " " + event.reason); - } + webSocket.onclose = function (event) { + if (!event.wasClean) { + fail("connection closed with unexpected status code: " + event.code + " " + event.reason); + } - // Jasmine doesn't like tests without expectations - expect(event.wasClean).toBe(true); + // Jasmine doesn't like tests without expectations + expect(event.wasClean).toBe(true); - done(); - }; + done(); + }; + }); }); -}); +}