SignalR js 客户端似乎忽略了 url 端口

Posted

技术标签:

【中文标题】SignalR js 客户端似乎忽略了 url 端口【英文标题】:SignalR js client seems to be ignoring the url port 【发布时间】:2012-11-16 13:53:59 【问题描述】:

我正在尝试用 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://";

这是一个错误吗?还是我误会了什么?

【问题讨论】:

【参考方案1】:

好吧,我可以发誓我已经尝试过了,但没有成功,但是当我对其进行更多故障排除时,我更改了 URL 分配:

$.connection.url = "http://<%=Request.Url.Host %>:8080/signalr";

到这里:

$.connection.hub.url = "http://<%=Request.Url.Host %>:8080/signalr";

可以肯定的是,这就是它的记录方式here。我以为我已经在某处看到它以第一种方式记录,但我现在找不到它。那好吧。将此归咎于我没有足够的注意力。

【讨论】:

当前 wiki 中肯定缺少此信息。

以上是关于SignalR js 客户端似乎忽略了 url 端口的主要内容,如果未能解决你的问题,请参考以下文章

signalr和node.js哪个好

SignalR 设计理念

SignalR的简单使用()

初识SignalR

Signalr手持令牌验证

SignalR集群采用Nginx进行负载均衡后连接失败