我正在尝试用 SignalR 组合一个简单的“Hello World”风格的应用程序。稍微复杂的因素是 SignalR 集线器需要自托管,而不是在 IIS/ASP.NET 中。据我所知,我已经让服务器端工作了,它在端口 8080 上可用,但我在连接客户端时遇到了麻烦。我目前遇到的问题是 SignalR 客户端似乎忽略了我指定的 URL 上的端口。
具体来说,我在这里有这段代码:
<head runat="server">
<script type="text/javascript" src="/Scripts/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="/Scripts/json2.min.js"></script>
<script type="text/javascript" src="/Scripts/jquery.signalR-0.5.3.js"></script>
<script type="text/javascript" src="http://<%=Request.Url.Host %>:8080/signalr/hubs"></script>
<title>SignalR Test</title>
</head>
<body>
<script type="text/javascript">
$(function () {
// Wire up the client to the SignalR server on the same host
// as the source of this page, but on port 8080.
$.connection.url = "http://<%=Request.Url.Host %>:8080/signalr";
var roomHub = $.connection.roomHub;
$('#echoButton').click(function () {
roomHub.echo($('#echoButton').val())
.error(function (err) {
alert(err);
});
});
$.connection.hub.start({ transport: 'auto', xdomain: true })
.done(function () {
console.log('Connected.');
})
.fail(function (e) {
console.log('Unable to connect:' + e);
});
});
</script>
:8080/signalr/hubs 脚本加载成功,看起来不错,也就是说,里面有定义roomHub
,所以我知道服务器已经启动并正在运行。
但是,在$.connection.hub.start()
运行时,它似乎应该尝试为诸如http://app.dev.alanta.com:8080/signalr/signalr/negotiate?=1353072553935之类的 URL 打开连接。相反,Firebug 告诉我它忽略了 8080 部分,而是尝试与 URL http://app.dev.alanta.com/signalr/signalr/negotiate?=1353072553935协商连接。当然,这不起作用 - 没有 SignalR 服务在端口 80 上侦听,只有常规 Web 服务器 - 所以它失败并显示消息“无法连接:SignalR:协商请求期间出错”。
我还应该注意,在 jquery.signalR-0.5.3.js 文件中,解析连接的代码位似乎确实忽略了端口:
// Resolve the full url
parser.href = connection.url;
if (!parser.protocol || parser.protocol === ":") {
connection.protocol = window.document.location.protocol;
connection.host = window.document.location.host;
connection.baseUrl = connection.protocol + "//" + connection.host;
}
else {
connection.protocol = parser.protocol;
connection.host = parser.host;
connection.baseUrl = parser.protocol + "//" + parser.host;
}
// Set the websocket protocol
connection.wsProtocol = connection.protocol === "https:" ? "wss://" : "ws://";
这是一个错误吗?还是我误解了什么?