SignalR - 无法从外部JavaScript客户端

时间:2016-02-18 11:30:05

标签: asp.net signalr

我正在学习SignalR。使用教程我设法创建一个非常简单的基于ASP.NET MVC的SignalR服务器。这是集线器的代码:

[HubName("echo")]
public class EchoHub : Hub
{
    public void Say(string message)
    {
        Trace.WriteLine(message);
    }
}

这是我的启动文件:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
                EnableJSONP = true
            };
            map.RunSignalR(hubConfiguration);
        });
    }
}

接下来,我创建了一个基于HTML / JavaScript的客户端,它与服务器代码位于同一个项目中。此客户端正常工作,当我调试应用程序时,“输出”窗口显示我的消息。这是第一个客户的代码:

<script src="../Scripts/jquery-1.10.2.min.js"></script>
<script src="../Scripts/jquery.signalR-2.1.2.min.js"></script>
<script src="/signalr/hubs"></script>
<script>
        $(function() {
            var hubProxy = $.connection.echo;
            $.connection.hub.logging = true;

            $.connection.hub
                .start()
                .done(function () {
                    hubProxy.server.say('Hello SignalR');
                });
        })
</script>

我想做的最后一件事是在单独的项目中创建一个客户端。我改变了一点代码,主要是通过添加服务器的url。但是这个客户端无法正常工作。这是客户的代码:

<script src="Scripts/jquery-1.6.4.min.js"></script>
<script src="Scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="http://localhost:51644/signalr/hubs"></script>
<script>
    $(function() {
        $.connection.hub.url = 'http://localhost:51644/signalr';
        var hubProxy = $.connection.echo;
        $.connection.hub.logging = true;

        $.connection.hub
            .start()
            .done(function () {
                hubProxy.server.say('Hello SignalR');
            });
    })
 </script>

在开始连接后,JavaScript甚至没有在done方法中输入函数。但是在Chrome控制台中,没有任何错误或异常被抛出。

所以问题是我在第二个客户端做错了什么?

编辑:我在Chrome控制台中启用并检查了SignalR客户端日志。第二个客户端正在停止步骤“SignalR:与'/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%5D'进行协商。”没有错误返回,一切似乎都没问题,但客户端无法通过这一步。

EDIT2 :根据JF Beaulieu的评论,谈判返回200状态代码,但没有别的。在谈判之后应该有下一步,比如调用Say,但在外部客户端挂起谈判。我在此处粘贴来自内置和外部JavaScript客户端的控制台输出。

构建客户端输出:

enter image description here

外部客户端输出:

enter image description here

第二个屏幕截图显示客户端在协商步骤上停止执行。

我也尝试过Mareq的解决方案,但添加jsonp属性并没有帮助。

EDIT3 :我在这里添加了一个链接到我的Github仓库这个项目,服务器在AspNetServer项目和JavaScriptClient项目中的客户端,希望有助于: https://github.com/RomanSuska/SignalRSandbox

3 个答案:

答案 0 :(得分:2)

我终于找到了问题的解决方案,这很简单。问题在于SignalR JavaScript文件版本,在服务器上我使用的是SignalR的2.1.2版本,在客户端上我使用的是2.2.0。当我将客户端版本切换到2.1.2时,一切都开始工作了。

答案 1 :(得分:0)

将此参数添加到start

$.connection.hub.start({ jsonp: true });

编辑我在控制台应用中托管了SignalR,我使用了简单的设置配置:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR(new HubConfiguration { EnableJSONP = true });
    }
}

我使用的客户端代码如下:

$(function () {
        var hub = $.connection.serviceHub;
        $.connection.hub.url = 'http://mareq.ddns.net:8087/signalr';

        $.connection.hub.start({ jsonp: true });

        ...
    });

答案 2 :(得分:0)

我的情况是由于我的Hub具有构造函数,因为我试图使用Unity进行依赖注入。删除构造函数后,一切正常。