Internet explorer 使用Internet Explorer 11时,客户端将不会连接到本地自托管信号器服务器
我们有一个自托管的SignalR服务器(Windows应用程序),在Internet explorer 使用Internet Explorer 11时,客户端将不会连接到本地自托管信号器服务器,internet-explorer,azure,cross-domain,signalr,signalr-hub,Internet Explorer,Azure,Cross Domain,Signalr,Signalr Hub,我们有一个自托管的SignalR服务器(Windows应用程序),在http://localhost:8080。我们还有一个单独的网站,其中有一个页面,通过集线器连接到自托管的SignalR服务器。当网站托管在我的本地计算机上时,客户机可以很好地连接到SignalR服务器。一旦我将网站部署到Azure服务器,客户端页面将不再连接到本地Signal服务器 我们正在使用SignalR版本2.1.1和JQuery 2.1.1 奇怪的是,这个问题只发生在IE中(我们使用的是版本11)。当带有客户端的网站
http://localhost:8080
。我们还有一个单独的网站,其中有一个页面,通过集线器连接到自托管的SignalR服务器。当网站托管在我的本地计算机上时,客户机可以很好地连接到SignalR服务器。一旦我将网站部署到Azure服务器,客户端页面将不再连接到本地Signal服务器
我们正在使用SignalR版本2.1.1和JQuery 2.1.1
奇怪的是,这个问题只发生在IE中(我们使用的是版本11)。当带有客户端的网站托管在本地时,IE可以正常工作,但当网站托管在云中时,IE无法工作。使用Chrome(最新版本)时,无论网站位于何处,客户端都将连接
起初我以为这只是CORS的问题,所以我研究了所有我能找到的东西,尝试了这里以及其他地方推荐的所有东西,但都没有用
以下是客户端页面托管在Azure中(客户端不会连接)的场景的IE控制台日志(来自$.connection.hub.logging=true):
下面是相应的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控制台日志(当客户端网站托管在本地时):
下面是成功场景对应的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都能正常工作
以下是信号服务器的启动和集线器代码:
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中有效,而在IE11中无效吗?我在这件事上绞尽脑汁,想不出解决办法。任何帮助都将不胜感激
谢谢经过进一步的研究,我发现了这个问题,并找到了解决方案。解决方法是选择 设置->Internet选项->安全->本地intranet->站点
并取消选中“包括其他区域中未列出的所有本地(内部网)站点”。如果添加
http://mysite.azurewebsites.net
在IE中访问受信任的站点?
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
});
});